2013-01-15 1 views
40

Jackson ha annotazioni per ignorare le proprietà sconosciute all'interno di una classe utilizzando:Come si imposta a livello globale Jackson per ignorare le proprietà sconosciute in primavera?

@JsonIgnoreProperties(ignoreUnknown = true) 

Esso consente di ignorare una proprietà specifica utilizzando questa annotazione:

@JsonIgnore 

Se vuoi a livello globale impostarlo voi può modificare il mapper oggetto:

// jackson 1.9 and before 
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
// or jackson 2.0 
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

Come si fa a impostare questo utilizzando a livello globale primavera in modo che possa essere @Autowired a il server si avvia senza scrivere classi aggiuntive?

risposta

34

Questo può essere realizzato usando di molla MethodInvokingFactoryBean:

<!-- Jackson Mapper --> 
<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonObjectMapper" /> 
    <property name="targetMethod" value="configure" /> 
    <property name="arguments"> 
     <list> 
      <value type="org.codehaus.jackson.map.DeserializationConfig.Feature">FAIL_ON_UNKNOWN_PROPERTIES</value> 
      <value>false</value> 
     </list> 
    </property> 
</bean> 

Questo può essere collegato ad un RestTemplate simili:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
       <property name="objectMapper" ref="jacksonObjectMapper" /> 
      </bean> 
     </list> 
    </property> 
</bean> 

Può anche essere iniettato direttamente nei convertitori di messaggi per uso con Spring MVC:

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <!-- Jackson converter for HTTP messages --> 
     <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
      <property name="objectMapper" ref="jacksonObjectMapper" /> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 
+1

Non so quale sia la differenza, ma io sto usando com.fasterxml.jackson.databind.ObjectMapper e aveva pertanto di utilizzare com.fasterxml.jackson.databind.DeserializationFeature. Leggermente diverso se si osserva molto attentamente il bean jacksonObjectMapper e il suo MethodInvokingFactoryBean associato. –

+1

Per Jackson v2 messaggio definito dovrebbe essere convertito: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter – svlada

18

Per le versioni più recenti di Jackson (2.x) ci sono alcuni ch anges:

<!-- Jackson Mapper --> 
<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" /> 
<bean 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonObjectMapper" /> 
    <property name="targetMethod" value="configure" /> 
    <property name="arguments"> 
     <list> 
      <value type="com.fasterxml.jackson.databind.DeserializationFeature">FAIL_ON_UNKNOWN_PROPERTIES</value> 
      <value>false</value> 
     </list> 
    </property> 
</bean> 
+1

Nel codice Java, è in questo modo: \t \t objectMapper.configure (com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); –

30

Per 1.9x Jackson o al di sotto si può ignorare proprietà sconosciute con il fornitore oggetto mapper

@Provider 
@Component 
public class JerseyObjectMapperProvider implements ContextResolver<ObjectMapper> { 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 

     ObjectMapper result = new ObjectMapper(); 
     result.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     return result; 
    } 
} 

Jackson 2.xe sopra si può ignorare proprietà sconosciute con il fornitore oggetto mapper

Le classi Jersey non vengono scoperte automaticamente da Spring. Devo registrarli manualmente.

public class JerseyConfig extends ResourceConfig { 
    public JerseyConfig() { 
     register(JerseyObjectMapperProvider.class); 
    } 
} 
+1

nota: per utilizzare questa configurazione di Jersey con Spring Boot è necessario registrarsi anche manualmente: '/ ** * Le classi Jersey non vengono scoperte automaticamente da Spring. Devo registrarli manualmente. */ @Named classe pubblica JerseyConfig estende ResourceConfig { public JerseyConfig() { this.register (JerseyObjectMapperProvider.class); } } ' – Alex

+0

Grazie per il suggerimento @Alex – xdebug