2016-12-13 3 views
1

@JsonIgnoreProperties (ignoreUnknown = false)는 Spring 4.2.0 및 Spring의 상위 버전에서 작동하지 않습니다. 하지만 4.0.4 및 4.0.1에서 작동합니다. 나는 봄 4.2.8를 사용하고 난 후 유효한 요청으로 받아들이고 잘못된 필드 JSON 요청을 보내는 경우 잭슨 종속성@JsonIgnoreProperties (ignoreUnknown = false)가 Spring 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; 
} 

이있는 경우는

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

처럼해야하지만 잘못된 필드 JSON 요청을 보낼 경우에도 여전히 받아들이고 아래처럼.

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

는하지만 스프링의 이전 버전에서 제공하는 HttpMessageConverterObjectMapper 기본 구성을 사용하고 있기 때문에 이런 일이

+0

누구든지이 문제에 대해 알고 계십니까? 친절하게 결의안에 대한 조언. – Masbha

답변

0

응답으로 잘못된 요청을 제공해야합니다. 그러나 새로운 버전의 스프링은 기본적으로 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 속성이 false로 설정된 Jackson2ObjectMapperBulider을 사용합니다. (참고 번호 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의 답변에 따라에 대한 주석은 기반 솔루션 : 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

대답은 상자 밖에서 나에게 잘 맞지 않았지만 주위를 둘러보기에 좋은 힌트를 주었다. 그래서 이것은 나를 위해 일하는 것입니다. 내 봄은 4.3.12입니다. 릴리스 및 잭슨은 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; 
} 
관련 문제