У меня есть весенний веб-сервис, который возвращает JSON-ответ. Я использую приведенный здесь пример для создания сервиса: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/
Формат, в котором возвращается json: { "Имя": нулевой, "staffName": [ "KFC-Kampar", "кузнец"]}
Я хочу удалить все нулевые объекты из возвращенного ответа, чтобы он выглядел так: { "StaffName": [ "KFC-Kampar", "Смит"]}
Я нашел похожие вопросы, задаваемые здесь, но я смог найти решение, работающее, например,
Настройка ObjectMapper в Spring
настройка jacksonObjectMapper не работает spring MVC 3
как настроить пружинный MVC 3, чтобы он не возвращал "ноль" объект в ответе json?
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>
Класс обслуживания такой же, как указан на сайте 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.
Проект компилируется успешно, но когда я вызываю сервис через браузер, я все равно получаю то же самое, т.е. { "Имя": нулевой, "staffName": [ "KFC-Kampar", "кузнец"]}
Может кто-нибудь сказать мне, где я не так с моей конфигурации?
Я пробовал несколько других вариантов, но единственный способ вернуть 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, но это решение мне не подходит.
Я не понимаю, почему это работает в коде, но не в конфигурации, поэтому любая помощь будет фантастической.