복붙노트

[SPRING] Spring REST Service : json 응답에서 null 객체를 제거하도록 구성하는 방법

SPRING

Spring REST Service : json 응답에서 null 객체를 제거하도록 구성하는 방법

나는 json 응답을 리턴하는 스프링 웹 서비스를 가지고있다. 여기에 제공된 예제를 사용하여 서비스를 생성합니다. http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

json이 반환되는 형식은 다음과 같습니다. { "name": null, "staffName": [ "kfc-kampar", "smith"]}

반환 된 응답에서 null 객체를 제거하여 다음과 같이 표시합니다. { "staffName": [ "kfc-kampar", "smith"]}

비슷한 질문을 발견했지만 솔루션을 얻을 수있었습니다. 예 :

Spring에서 ObjectMapper 구성하기

스프링 주석 기반 구성을 사용하는 동안 MappingJacksonHttpMessageConverter를 구성하는 방법은 무엇입니까?

springmvc에서 작동하지 않는 jacksonObjectMapper 구성 3

JSON 응답에서 "null"객체를 반환하지 않도록 spring mvc 3을 구성하는 방법은 무엇입니까?

Spring이 @ResponseBody JSON 형식을 구성합니다.

Jackson + Spring3.0.5 사용자 정의 객체 매퍼

이 소스 코드와 다른 소스를 읽으면서 필자는 Spring 3.1과 mvc-annotation 내에서 구성 할 수있는 메시지 변환기를 사용하는 것이 가장 이상한 방법이라고 생각했습니다. 업데이트 된 스프링 구성 파일은 다음과 같습니다.

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

<context:component-scan base-package="com.mkyong.common.controller" />

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="prefixJson" value="true" />
            <property name="supportedMediaTypes" value="application/json" />
            <property name="objectMapper">
                <bean class="org.codehaus.jackson.map.ObjectMapper">
                    <property name="serializationInclusion" value="NON_NULL"/>
                </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

서비스 클래스는 Shop 이름 변수의 설정을 주석 처리 했으므로 mkyong.com 사이트에서 제공 한 것과 동일합니다. 즉, null입니다.

@Controller
@RequestMapping("/kfc/brands")
public class JSONController {
    @RequestMapping(value="{name}", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK) 
    public @ResponseBody Shop getShopInJSON(@PathVariable String name) {
        Shop shop = new Shop();
        //shop.setName(name);
        shop.setStaffName(new String[]{name, "cronin"});
        return shop;
    }
}

내가 사용하고있는 잭슨 병은 jackson-mapper-asl 1.9.0과 jackson-core-asl 1.9.0입니다. 이것들은 mkyong.com에서 다운로드 한 spring-json 프로젝트의 일부로 제공되는 pom에 추가 된 유일한 새로운 항아리입니다.

프로젝트는 성공적으로 빌드되지만, 브라우저를 통해 서비스를 호출 할 때 나는 여전히 똑같은 것을 얻는다. { "name": null, "staffName": [ "kfc-kampar", "smith"]}

아무도 내 구성이 잘못 될 수 있다고 말할 수 있습니까?

몇 가지 다른 옵션을 시도했지만 정확한 형식으로 json을 반환 할 수있는 유일한 방법은 객체 매퍼를 JSONController에 추가하고 "getShopInJSON"메소드가 문자열을 반환하도록하는 것입니다.

public @ResponseBody String getShopInJSON(@PathVariable String name) throws JsonGenerationException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);

    Shop shop = new Shop();
    //shop.setName(name);
    shop.setStaffName(new String[]{name, "cronin"});
    String test = mapper.writeValueAsString(shop);
    return test;
}

이제 내가 서비스를 호출하면 기대 한대로 얻을 수 있습니다. { "staffName": [ "kfc-kampar", "cronin"]}

또한 @JsonIgnore 주석을 사용하여 작동시킬 수도 있지만이 솔루션은 저에게 적합하지 않습니다.

왜 코드에서 작동하지만 구성에서는 작동하지 않는지 이해할 수 없으므로 어떤 도움이라도 환상적입니다.

해결법

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

    1.Jackson 2.0부터 JsonInclude를 사용할 수 있습니다.

    Jackson 2.0부터 JsonInclude를 사용할 수 있습니다.

    @JsonInclude(Include.NON_NULL)
    public class Shop {
        //...
    }
    
  2. ==============================

    2.Jackson은 사용 중이므로 Jackson 속성으로 구성해야합니다. Spring Boot REST 서비스의 경우, application.properties에서이를 설정해야한다.

    Jackson은 사용 중이므로 Jackson 속성으로 구성해야합니다. Spring Boot REST 서비스의 경우, application.properties에서이를 설정해야한다.

    spring.jackson.default-property-inclusion = NON_NULL
    

    출처

  3. ==============================

    3.Jackson 2를 사용하는 경우 message-converters 태그는 다음과 같습니다.

    Jackson 2를 사용하는 경우 message-converters 태그는 다음과 같습니다.

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="prefixJson" value="true"/>
                <property name="supportedMediaTypes" value="application/json"/>
                <property name="objectMapper">
                    <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                        <property name="serializationInclusion" value="NON_NULL"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    
  4. ==============================

    4.Jackson 2.0 현재, @JsonSerialize (include = xxx)는 @JsonInclude를 위해 더 이상 사용되지 않습니다.

    Jackson 2.0 현재, @JsonSerialize (include = xxx)는 @JsonInclude를 위해 더 이상 사용되지 않습니다.

  5. ==============================

    5.

    @JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)
    public class Shop {
        //...
    }
    

    jackson 2.0 이상에서 @JsonInclude (Include.NON_NULL)을 사용합니다.

    이렇게하면 빈 객체와 null 객체가 모두 제거됩니다.

  6. ==============================

    6.버전 1.6부터 우리는 새로운 주석 JsonSerialize (예를 들어 버전 1.9.9에서)를 가지고있다.

    버전 1.6부터 우리는 새로운 주석 JsonSerialize (예를 들어 버전 1.9.9에서)를 가지고있다.

    예:

    @JsonSerialize(include=Inclusion.NON_NULL)
    public class Test{
    ...
    }
    

    기본값은 항상입니다.

    이전 버전에서는 JsonWriteNullProperties를 사용할 수 있습니다. JsonWriteNullProperties는 새 버전에서 더 이상 사용되지 않습니다. 예:

    @JsonWriteNullProperties(false)
    public class Test{
        ...
    }
    
  7. ==============================

    7.당신이 아닌 모든 사람들을 위해 :

    당신이 아닌 모든 사람들을 위해 :

    ObjectMapper objMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
    HttpMessageConverter msgConverter = new MappingJackson2HttpMessageConverter(objMapper);
    restTemplate.setMessageConverters(Collections.singletonList(msgConverter));
    
  8. ==============================

    8.Spring 컨테이너를 구성하여 해결책을 찾았지만 여전히 원하는 것은 아닙니다.

    Spring 컨테이너를 구성하여 해결책을 찾았지만 여전히 원하는 것은 아닙니다.

    나는 Spring 3.0.5로 되돌아 갔다. 제거하고 그 곳에서 config 파일을 다음과 같이 바꾼다.

        <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                    <property name="objectMapper" ref="jacksonObjectMapper" />
                </bean>
            </list>
        </property>
    </bean>
    
    
    <bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />
    <bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
        factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" />
    <bean
        class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetObject" ref="jacksonSerializationConfig" />
        <property name="targetMethod" value="setSerializationInclusion" />
        <property name="arguments">
            <list>
                <value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value>
            </list>
        </property>
    </bean>
    

    이것은 물론 다른 질문에서 주어진 응답과 유사합니다.

    springmvc에서 작동하지 않는 jacksonObjectMapper 구성 3

    중요한 점은 mvc : annotation-driven과 AnnotationMethodHandlerAdapter는 같은 맥락에서 사용될 수 없다는 것입니다.

    나는 아직도 스프링 3.1과 mvc : annotation-driven으로 작업 할 수 없다. mvc : annotation-driven를 사용하는 솔루션과이 솔루션에 수반되는 모든 이점이 훨씬 더 좋습니다. 누구든지 나에게이 일을하는 법을 보여줄 수 있다면 그것은 좋을 것이다.

  9. ==============================

    9.이전 버전의 JsonWriteNullProperties를 사용할 수 있습니다.

    이전 버전의 JsonWriteNullProperties를 사용할 수 있습니다.

    Jackson 1.9 이상인 경우 JsonSerialize.include를 사용하십시오.

  10. from https://stackoverflow.com/questions/12707165/spring-rest-service-how-to-configure-to-remove-null-objects-in-json-response by cc-by-sa and MIT license