2016-12-13 8 views
1

@JsonIgnoreProperties (ignoreUnknown = false) не работает с весной 4.2.0 и верхней версией весны. Но он работает с 4.0.4 и 4.0.1. Я использую весной 4.2.8 и Джексон зависимостей используется@JsonIgnoreProperties (ignoreUnknown = false) не работает весной 4.2.0, а верхняя версия

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

Если я отправить запрос JSON с недопустимыми полями, то он принимает на себя в качестве действительного запроса. Но он должен дать плохую просьбу в качестве ответа. Например: Если у меня есть класс

public class Student{ 
    private String id; 
    private String name; 
} 

Если отправить действительные соответствующие JSON запросить он должен быть как

{ 
    "id": "123", 
    "name": "test" 
} 

Но даже если я посылаю запрос JSon с недопустимыми полями, как под ним все еще принимает.

{ 
    "id": "123", 
    "name": "test", 
    "anyinvalidkey": "test" 
} 

Но он должен дать плохой запрос как ответ

+0

У кого-нибудь есть идея по этой проблеме. Просьба сообщить о разрешении. – Masbha

ответ

0

Это происходит потому, что HttpMessageConverter обеспечивается более ранними версиями весной использовал ObjectMapper конфигурацию по умолчанию. Но более новые версии весны используют Jackson2ObjectMapperBulider, у которого DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES свойство установлено в false по умолчанию. (Ссылка link). Вы можете решить эту проблему, добавив следующее в вашем applicationContext.xml:

<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" /> 

<mvc:annotation-driven 
    content-negotiation-manager="contentNegotiationManager"> 
    <mvc:message-converters> 
     <bean 
      class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper" ref="jacksonObjectMapper" /> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 
<bean id="contentNegotiationManager" 
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
    <property name="mediaTypes"> 
     <value> 
      json=application/json 
     </value> 
    </property> 
</bean> 
1

аннотацию решение, основанное на на основе ответа от Aarya может сделано следующим образом:

@Configuration 
public class Config implements InitializingBean { 

    @Autowired 
    private RequestMappingHandlerAdapter converter; 

    @Override 
    public void afterPropertiesSet() throws Exception { 
     configureJacksonToFailOnUnknownProperties(); 
    } 

    private void configureJacksonToFailOnUnknownProperties() { 
     MappingJackson2HttpMessageConverter httpMessageConverter = converter.getMessageConverters().stream() 
       .filter(mc -> mc.getClass().equals(MappingJackson2HttpMessageConverter.class)) 
       .map(mc -> (MappingJackson2HttpMessageConverter)mc) 
       .findFirst() 
       .get(); 

     httpMessageConverter.getObjectMapper().enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
    } 
} 
0

@ Aarya-х ответ не работал для меня прямо из коробки, но дал мне отличный намек, чтобы осмотреться. Так это и работает для меня. Учитывая, что моя весна равна 4.3.12. RELEASE и jackson - 2.9.2

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper"> 
        <bean class="com.fasterxml.jackson.databind.ObjectMapper" /> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 
0

Простой подход, основанный на аннотациях. В @ Конфигурация:

@Bean 
@Primary 
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { 
    ObjectMapper objectMapper = builder.createXmlMapper(false).build(); 
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true); 
    return objectMapper; 
}