unrecognized unknown property not marked ignorable fields false fail_on_unknown_properties deserializationfeature xml spring jackson

xml - unknown - ¿Cómo se establece globalmente que Jackson ignore las propiedades desconocidas en Spring?



objectmapper set ignore unknown (3)

Jackson tiene anotaciones para ignorar propiedades desconocidas dentro de una clase usando:

@JsonIgnoreProperties(ignoreUnknown = true)

Le permite ignorar una propiedad específica usando esta anotación:

@JsonIgnore

Si desea configurarlo globalmente, puede modificar el asignador de objetos:

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

¿Cómo se establece esto globalmente usando un resorte para que pueda ser @Autowired en el inicio del servidor sin escribir clases adicionales?


Esto se puede lograr usando MethodInvokingFactoryBean de primavera:

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

Esto se puede conectar a una RestTemplate como esta:

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

También se puede inyectar directamente en los convertidores de mensajes para su 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>


Para jackson 1.9x o inferior, puede ignorar las propiedades desconocidas con el proveedor de asignador de objetos

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

Para jackson 2.xy posteriores, puede ignorar las propiedades desconocidas con el proveedor de asignador de objetos

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

Las clases de Jersey no son descubiertas automáticamente por Spring. Debe registrarlos manualmente.

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


Para las versiones más nuevas de Jackson (2.x) hay algunos cambios:

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