복붙노트

[SPRING] Spring 내에서 알려지지 않은 속성을 무시하도록 Jackson을 어떻게 세계적으로 설정합니까?

SPRING

Spring 내에서 알려지지 않은 속성을 무시하도록 Jackson을 어떻게 세계적으로 설정합니까?

Jackson은 다음을 사용하여 클래스 내에서 알 수없는 속성을 무시하는 주석을 가지고 있습니다.

@JsonIgnoreProperties(ignoreUnknown = true) 

이 주석을 사용하여 특정 속성을 무시할 수 있습니다.

@JsonIgnore

전역 적으로 설정하려면 객체 매퍼를 수정할 수 있습니다.

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

Spring을 사용하여 이것을 어떻게 전역 적으로 설정합니까? 그래서 추가 클래스를 작성하지 않고 서버 시작시 @Autowired가 될 수 있습니까?

해결법

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

    1.jackson 1.9x 이하에서는 객체 매퍼 공급자로 알 수없는 속성을 무시할 수 있습니다.

    jackson 1.9x 이하에서는 객체 매퍼 공급자로 알 수없는 속성을 무시할 수 있습니다.

    @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 이상에서는 객체 매퍼 공급자로 알 수없는 속성을 무시할 수 있습니다.

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

    저지 클래스는 Spring에 의해 자동 발견되지 않습니다. 수동으로 등록해야합니다.

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

    2.이것은 Spring의 MethodInvokingFactoryBean을 사용하여 달성 할 수있다.

    이것은 Spring의 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>
    

    다음과 같이 RestTemplate에 유선 연결될 수 있습니다.

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

    또한 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>
    
  3. ==============================

    3.최신 Jackson 버전 (2.x)에는 몇 가지 변경 사항이 있습니다.

    최신 Jackson 버전 (2.x)에는 몇 가지 변경 사항이 있습니다.

    <!-- 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>
    
  4. from https://stackoverflow.com/questions/14343477/how-do-you-globally-set-jackson-to-ignore-unknown-properties-within-spring by cc-by-sa and MIT license