一尘不染

Spring REST Service:如何配置为在JSON响应中删除空对象

spring

通过阅读这些和其他资料,我发现实现我想要的最干净的方法是使用Spring 3.1和可以在mvc-annotation中配置的消息转换器。我更新的spring配置文件是:

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

服务类与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;
    }
}

我正在使用的Jacksonjar是jackson-mapper-asl 1.9.0和jackson-core-asl 1.9.0。这些是我从mkyong.com下载的spring-json项目的一部分,是我添加到pom中的唯一新罐。

该项目成功构建,但是当我通过浏览器调用服务时,仍然得到相同的结果,即{“ name”:null,“ staffName”:[“ kfc-kampar”,“ smith”]}

谁能告诉我我的配置哪里出问题了?

我尝试了其他几种选择,但是我能够以正确格式返回json的唯一方法是将Object映射器添加到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批注使其正常工作,但是该解决方案不适合我。

我不明白为什么它可以在代码中工作,但不能在配置中工作,所以任何帮助都是很棒的。


阅读 379

收藏
2020-04-16

共1个答案

一尘不染

从Jackson 2.0开始,你可以使用JsonInclude

@JsonInclude(Include.NON_NULL)
public class Shop {
    //...
}
2020-04-16