복붙노트

[SPRING] @JsonIgnoreProperties (ignoreUnknown = false)가 Spring 4.2.0 및 상위 버전에서 작동하지 않습니다.

SPRING

@JsonIgnoreProperties (ignoreUnknown = false)가 Spring 4.2.0 및 상위 버전에서 작동하지 않습니다.

@JsonIgnoreProperties (ignoreUnknown = false)는 스프링 4.2.0 및 스프링의 상위 버전에서 작동하지 않습니다. 그러나 4.0.4 및 4.0.1에서 작동합니다. 스프링 4.2.8을 사용하고 있으며 잭슨 의존성이 사용됩니다.

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

하지만 응답으로 잘못된 요청을 제공해야합니다.

해결법

  1. ==============================

    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);
        }
    }
    
  2. ==============================

    2.간편한 주석 기반 솔루션. @Configuration에서 :

    간편한 주석 기반 솔루션. @Configuration에서 :

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

    3.이것은 이전 버전의 Spring에서 제공 한 HttpMessageConverter가 ObjectMapper 기본 구성을 사용했기 때문에 발생합니다. 그러나 최신 버전의 스프링에서는 기본적으로 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 속성이 false로 설정된 Jackson2ObjectMapperBulider를 사용합니다. (참조 링크). applicationContext.xml에 다음을 추가하여이 문제를 해결할 수 있습니다.

    이것은 이전 버전의 Spring에서 제공 한 HttpMessageConverter가 ObjectMapper 기본 구성을 사용했기 때문에 발생합니다. 그러나 최신 버전의 스프링에서는 기본적으로 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 속성이 false로 설정된 Jackson2ObjectMapperBulider를 사용합니다. (참조 링크). 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>
    
  4. ==============================

    4.@ Aarya의 대답은 나에게 잘 어울리지 못했지만 주위를 둘러보기에 좋은 힌트를 주었다. 그래서 이것은 나를 위해 일하는 것입니다. 내 봄이 4.3.12.RELEASE이고 jackson이 2.9.2라는 것을 감안할 때

    @ 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>
    
  5. from https://stackoverflow.com/questions/41128623/jsonignorepropertiesignoreunknown-false-is-not-working-in-spring-4-2-0-and-up by cc-by-sa and MIT license