2012-04-10 17 views
15

Sto cercando di rendere una proprietà in una classe di dominio nascosta ma continua ad apparire nel JSON in uscita. Sto utilizzando Jackson 2.0 e 3.1.1 PrimaveraLe annotazioni di Jackson vengono ignorate in primavera

uscita di/utenti/1:

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

La mia classe di dominio:

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

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

mio 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> 
... 

E il mio controller:

@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)); 
    } 
} 

risposta

10

Il problema è che Spring non funziona con Jackson 2.0. Questo è stato risolto nel modo seguente:

<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> 

E l'own.implementation.of.MappingJacksonHttpMessageConverter è sulla base di questo:

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

Ma usare ObjectMapper e altre classi Jackson da Jackson 2,0, invece di Jackson 1. *

+0

Penso che mi limiterò a downgrade a Jackson 1.9 che sembra risolvere il mio problema. –

+0

A meno che non siano necessarie funzionalità da 2.0 (come il passaggio di oggetti con relazioni bidirezionali). Ecco perché ho aggiornato a 2.0. –

0

La mia configurazione è simile al seguente

<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> 

mio regolatore di simile a questa

@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); 
    } 
}  

mio SearchResponse è la struttura più complessa ma contiene questo tipo di oggetti.

+0

L'aggiunta della proprietà non sembra fare alcuna differenza, probabilmente non è necessaria. –

+0

Prova a mettere l'annotazione di ignora sul campo non getter. Penso che Jackson di default legge e imposta direttamente il campo modulo. – chalimartines

+0

Ho paura che non ha funzionato. Non penso che stia usando Jackson - è in grado di serializzare il JSON senza che il vaso Jackson sia disponibile. Inoltre non dovrei usare @ResponseBody con ContentNegotiatingViewResolver, invece dovrei restituire la vista "json" o usare invece HttpMessageConverter. –

11

Il supporto per Jackson 2 è stato aggiunto alla primavera 3.1.2 (backported da Spring 3.2 - SPR-9507). Aggiorna il tuo progetto da Spring 3.1.1 a Spring 3.1.2, e Jackson 2 funziona con la configurazione che hai già.

8

Oltre a l'aggiornamento a Spring 3.1.2, si hanno anche per cambiare il convertitore messaggio a org.springframework.web.servlet.view.json.MappingJackson**2**HttpMessageConverter

8

Se si utilizza la versione Spring 4, si dovrà fare in seguito, aggiornare la dipendenza

<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> 

Sostituire l'annotazione del codehaus precedente viene importata in seguito, se non si esegue questa operazione, le annotazioni precedenti come JsonIgnoreProperties non funzioneranno con la nuova versione di Jackson

import com.fasterxml.jackson.annotation.*; 

Rimuovere mediaTypes dal basso, è stato deprecato.

ContentNegotiatingViewResolver

, non necessario, saranno raccolti dal vaso quadro attivazione, vista Jackson dovrebbe usare

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> 

Problemi correlati