2012-04-10 27 views
15

Estoy tratando de ocultar una propiedad en una clase de dominio pero sigue apareciendo en el JSON de salida. Estoy usando Jackson 2.0 y 3.1.1 primaveraSe ignoran las anotaciones de Jackson en Spring

salida de/usuarios/1:

{"id":1,"password":null,"email":"[email protected]","firstName":"John","lastName":"Smith"} 

Mi clase de dominio:

@Entity 
public class User { 
    private String mPassword; 
    ... 
    @JsonIgnore 
    public String getPassword() { 
     return mPassword; 
    } 

    public void setPassword(String password) { 
     mPassword = password; 
    } 
    ... 
} 

Mi SpringMVC config:

... 
<mvc:annotation-driven/> 
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="favorPathExtension" value="true" /> 
    <property name="mediaTypes"> 
     <map> 
      <entry key="json" value="application/json"/> 
     </map> 
    </property> 
    <property name="defaultContentType" value="application/json"/> 
    <property name="defaultViews"> 
     <list> 
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> 
     </list> 
    </property> 
</bean> 
... 

Y mi controlador:

@Controller 
@RequestMapping("/users") 
public class UserController { 
    private UserService mUserService; 

    public UserController(){} 

    @Inject 
    public void setUserController(UserService userService){ 
     mUserService=userService; 
    } 

    @RequestMapping(value="/{id}", method=RequestMethod.GET) 
    public void getUser(@PathVariable("id") long id, Model model){ 
     model.addAttribute(mUserService.getUser(id)); 
    } 
} 

Respuesta

10

El problema es que Spring no funciona con Jackson 2.0. Esto ha sido resuelto de la siguiente manera:

<bean id="jacksonMessageConverter" 
      class="own.implementation.of.MappingJacksonHttpMessageConverter"/> 

<bean class="org.springframework.web.servlet.mvc 
      .annotation.AnnotationMethodHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jacksonMessageConverter"/> 
      </list> 
     </property> 
     <property name="requireSession" value="false"/> 
    </bean> 

Y el own.implementation.of.MappingJacksonHttpMessageConverter está basado en esto:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java?format=ok

Pero utilizar ObjectMapper y otras clases de Jackson Jackson 2.0 en vez de Jackson 1. *

+0

Creo que voy a degradar a Jackson 1.9 que parece resolver mi problema. –

+0

A menos que necesite funciones de 2.0 (como pasar objetos con relaciones bidireccionales). Es por eso que actualicé a 2.0. –

0

Mi configuración se parece a esto

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:order="1"> 
    <property name="mediaTypes"> 
    <map> 
     <entry key="html" value="text/html"/> 
     <entry key="json" value="application/json"/> 
    </map> 
    </property> 
    <property name="viewResolvers"> 
    <!-- this is not important for your jackson problem --> 
    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" p:order="2" depends-on="tilesConfigurer"/> 
    </property> 
    <property name="defaultViews"> 
    <list> 
     <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 
    </list> 
    </property> 
</bean> 

Mi controlador tiene este aspecto

@Controller 
public class SearchController { 
    @RequestMapping(value="/search", method = {RequestMethod.GET, RequestMethod.POST}) 
    public SearchResponse search(@RequestParam(value = QUERY, required = true) String query) { 
     return generateSearchResponse(query); 
    } 
}  

Mi SearchResponse es la estructura más compleja pero que contiene este tipo de objetos.

@JsonIgnoreProperties({ "popis" }) 
public class Kurz implements Serializable { 
    private String nazev; 
    private String popis; 
} 
+0

Al agregar la propiedad no pareció hacer ninguna diferencia, probablemente no sea necesaria. –

+0

Intenta poner ignorar la anotación en el campo no getter. Creo que Jackson por defecto lee y establece directamente el campo de formulario. – chalimartines

+0

Me temo que no funcionó. No creo que esté usando Jackson: es capaz de serializar el JSON sin que el tarro de Jackson esté disponible. Además, no debería usar @ResponseBody con ContentNegotiatingViewResolver, en su lugar debería devolver la vista "json" o utilizar HttpMessageConverter en su lugar. –

11

Se ha agregado soporte para Jackson 2 a Spring 3.1.2 (respaldado de Spring 3.2 - SPR-9507). Simplemente actualice su proyecto de Spring 3.1.1 a Spring 3.1.2, y Jackson 2 funciona con la configuración que ya tiene.

8

Además de la actualización a Spring 3.1.2, también hay que cambiar el convertidor de mensajes a org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter

8

Si está utilizando la versión Spring 4, tendrá que hacer después, actualizar la dependencia

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.3.3</version> 
    </dependency> 

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.3.3</version> 
</dependency> 

Reemplazar la importación de la anotación Codehaus más antigua para seguir, si no lo hace, su anotación más antigua como JsonIgnoreProperties no funcionará con la nueva versión de Jackson

import com.fasterxml.jackson.annotation.*; 

Eliminar mediaTypes de abajo, ha quedado obsoleto.

ContentNegotiatingViewResolver

, no se necesita, se recogió en tarro marco activación, vista Jackson debe utilizar

MappingJackson2JsonView

<beans:property name="viewResolvers"> 
    <beans:list> 
     <beans:bean 
      class="org.springframework.web.servlet.view.BeanNameViewResolver" /> 
     <beans:bean 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
      <beans:property name="prefix" value="/WEB-INF/views/" /> 
      <beans:property name="suffix" value=".jsp" /> 
     </beans:bean> 
     <beans:bean 
      class="org.springframework.web.servlet.view.tiles3.TilesViewResolver"> 
      <beans:property name="viewClass" 
       value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property> 
      <beans:property name="order" value="0"></beans:property> 
     </beans:bean> 
    </beans:list> 
</beans:property> 
<beans:property name="defaultViews"> 
    <beans:list> 
     <beans:bean 
      class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> 
    </beans:list> 
</beans:property> 

Cuestiones relacionadas