2013-01-15 14 views
40

Jackson ma adnotacji za ignorowanie nieznanych właściwości w obrębie klasy przy użyciu:Jak na całym świecie ustawić Jackson do ignorowania nieznanych właściwości w Spring?

@JsonIgnoreProperties(ignoreUnknown = true) 

To pozwala ignorować konkretnej nieruchomości za pomocą tej adnotacji:

@JsonIgnore 

Jeśli chcesz, aby globalnie ustawić to ty można modyfikować mapowania obiektu:

// 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); 

Jak ustawić tę globalnie za pomocą sprężyny więc może być w @Autowired uruchomienie serwera bez pisania dodatkowych zajęć?

Odpowiedz

34

Można to osiągnąć stosując wiosny w 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> 

ten może być podłączony do RestTemplate tak:

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

To może być także wstrzykiwane bezpośrednio do konwerterów wiadomości do użytku z wiosny 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

Nie wiesz, jaka jest różnica, ale używam com.fasterxml.jackson.databind.ObjectMapper i dlatego musiał użyć com.fasterxml.jackson.databind.DeserializationFeature. Nieco inny, jeśli spojrzysz bardzo dokładnie na fasolę jacksonObjectMapper i powiązany z nią MethodInvokingFactoryBean. –

+1

Dla Jacksona v2 zdefiniowanej wiadomości przeliczone powinno być: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter – svlada

18

Dla nowszych wersji Jacksona (2.x) jest kilka 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

w kodzie Javy, to jest tak: \t \t objectMapper.configure (com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, fałszywy); –

30

Dla 1.9x jackson lub poniżej można ignorować nieznane właściwości z dostawcą obiekt odwzorowujący

@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.x i powyżej można ignorować nieznane właściwości z dostawcą obiekt odwzorowujący

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

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

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

Klasy Jersey nie są automatycznie odkrywane przed wiosną. Musisz zarejestrować je ręcznie.

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

uwaga: aby korzystać z tej konfiguracji z Jersey Spring Boot, musisz również zarejestrować się ręcznie: '/ ** * Klasy Jersey nie są automatycznie odkrywane przed Wiosną. Musisz zarejestrować je ręcznie. */ @Named public class JerseyConfig rozszerza ResourceConfig { public JerseyConfig() { this.register (JerseyObjectMapperProvider.class); } } ' – Alex

+0

Dzięki za sugestię @Alex – xdebug

Powiązane problemy