[SPRING] Spring REST Service : json 응답에서 null 객체를 제거하도록 구성하는 방법
SPRINGSpring 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.Jackson 2.0부터 JsonInclude를 사용할 수 있습니다.
Jackson 2.0부터 JsonInclude를 사용할 수 있습니다.
@JsonInclude(Include.NON_NULL) public class Shop { //... }
-
==============================
2.Jackson은 사용 중이므로 Jackson 속성으로 구성해야합니다. Spring Boot REST 서비스의 경우, application.properties에서이를 설정해야한다.
Jackson은 사용 중이므로 Jackson 속성으로 구성해야합니다. Spring Boot REST 서비스의 경우, application.properties에서이를 설정해야한다.
spring.jackson.default-property-inclusion = NON_NULL
출처
-
==============================
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.Jackson 2.0 현재, @JsonSerialize (include = xxx)는 @JsonInclude를 위해 더 이상 사용되지 않습니다.
Jackson 2.0 현재, @JsonSerialize (include = xxx)는 @JsonInclude를 위해 더 이상 사용되지 않습니다.
-
==============================
5.
@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY) public class Shop { //... }
jackson 2.0 이상에서 @JsonInclude (Include.NON_NULL)을 사용합니다.
이렇게하면 빈 객체와 null 객체가 모두 제거됩니다.
-
==============================
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.당신이 아닌 모든 사람들을 위해 :
당신이 아닌 모든 사람들을 위해 :
ObjectMapper objMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); HttpMessageConverter msgConverter = new MappingJackson2HttpMessageConverter(objMapper); restTemplate.setMessageConverters(Collections.singletonList(msgConverter));
-
==============================
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.이전 버전의 JsonWriteNullProperties를 사용할 수 있습니다.
이전 버전의 JsonWriteNullProperties를 사용할 수 있습니다.
Jackson 1.9 이상인 경우 JsonSerialize.include를 사용하십시오.
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
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC - REST 서비스의 빈리스트에 @Valid (0) | 2018.12.23 |
---|---|
[SPRING] autowired 종속성의 주입이 실패했습니다. (0) | 2018.12.23 |
[SPRING] 모든 컨트롤러와 매핑을보기에 표시하는 방법 (0) | 2018.12.23 |
[SPRING] jpa / hibernate가있는 Spring에서 초기화 지연 예외를 피하기 위해 세션을 어떻게 열어 두어야합니까? (0) | 2018.12.23 |
[SPRING] 해결 스프링 : i18n 국제화를위한 javascript의 메시지 (0) | 2018.12.23 |