Spring REST Service: как настроить удаление нулевых объектов в ответе json

У меня есть весенний веб-сервис, который возвращает JSON-ответ. Я использую приведенный здесь пример для создания сервиса: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/

Формат, в котором возвращается json: {& Quot; имя & Quot;: NULL, & Quot; staffName & Quot;: [& Quot; KFC-Kampar & Quot;, & Quot; кузнца & Quot;]}

Я хочу удалить все нулевые объекты из возвращенного ответа, чтобы он выглядел так: {& Quot; staffName & Quot;: [& Quot; KFC-Kampar & Quot;, & Quot; кузнца & Quot;]}

Я нашел похожие вопросы, заданные здесь, но я смог найти решение, работающее, например.

Настройка ObjectMapper в Spring

Как настроить MappingJacksonHttpMessageConverter при использовании конфигурации на основе весенних аннотаций?

настройка jacksonObjectMapper не работает весной MVC 3

как настроить пружинный MVC 3, чтобы он не возвращал «ноль» объект в ответе json?

Spring настраивает формат @ResponseBody JSON

Джексон + 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>

Класс обслуживания такой же, как указан на сайте mkyong.com, за исключением того, что я закомментировал настройку переменной «Имя магазина», чтобы она была нулевой, т.е.

@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. Это единственные новые банки, которые я добавил в pom, как это предусмотрено в рамках проекта spring-json, который я скачал с mkyong.com.

Проект компилируется успешно, но когда я вызываю сервис через браузер, я все равно получаю то же самое, т.е. {& Quot; имя & Quot;: NULL, & Quot; staffName & Quot;: [& Quot; KFC-Kampar & Quot;, & Quot; кузнца & Quot;]}

Может кто-нибудь сказать мне, где я не так с моей конфигурации?

Я перепробовал несколько других вариантов, но единственный способ вернуть 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;
}

Теперь, если я вызываю сервис, я получаю ожидаемое, т.е. {& Quot; staffName & Quot;: [& Quot; KFC-Kampar & Quot;, & Quot; Cronin & Quot;]}

Я также смог заставить его работать, используя аннотацию @JsonIgnore, но это решение мне не подходит.

Я не понимаю, почему он работает в коде, но не в конфигурации, поэтому любая помощь будет фантастической.

Ответы на вопрос(8)

Ваш ответ на вопрос