Как настроить Jackson JSON mapper, неявно используемый Spring Boot?
Я использую Spring Boot (1.2.1), так же, как и в их создание веб-службы RESTful руководство:
@RestController
public class EventController {
@RequestMapping("/events/all")
EventList events() {
return proxyService.getAllEvents();
}
}
Итак, выше, Spring MVC неявно использует Джексона для сериализации my EventList объект в JSON.
но я хочу сделать некоторые простые настройки в формате JSON, такие как:
setSerializationInclusion(JsonInclude.Include.NON_NULL)
вопрос:каков самый простой способ настроить неявный JSON mapper?
Я попытался подходите в этот блог, создание CustomObjectMapper и так далее, но Шаг 3, "Регистрация классов в контексте Spring", не удается:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'jacksonFix': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException:
Could not autowire method: public void com.acme.project.JacksonFix.setAnnotationMethodHandlerAdapter(org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter);
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter]
found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
похоже, что эти инструкции предназначены для более старых версий Spring MVC, в то время как я ищу простой способ заставить это работать с последней загрузкой Spring.
9 ответов:
если вы используете Spring Boot 1.3, вы можете настроить включение сериализации через
application.properties:spring.jackson.serialization-inclusion=non_nullпосле изменений в Jackson 2.7, Spring Boot 1.4 использует свойство с именем
spring.jackson.default-property-inclusionвместо:spring.jackson.default-property-inclusion=non_nullв разделе "настроить Джексон ObjectMapper" раздел в документации по весенней загрузке.
если вы используете более раннюю версию Spring Boot, самый простой способ настроить включение сериализации в Spring Boot-объявить ваш собственные, соответствующим образом настроенные
Jackson2ObjectMapperBuilderбобовые. Например:@Bean public Jackson2ObjectMapperBuilder objectMapperBuilder() { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.serializationInclusion(JsonInclude.Include.NON_NULL); return builder; }
многое можно настроить в applicationproperties. К сожалению эта функция только в версии 1.3, но вы можете добавить в Config-Class
@Autowired(required = true) public void configeJackson(ObjectMapper jackson2ObjectMapper) { jackson2ObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); }[обновление: вы должны работать на ObjectMapper, потому что
build()- метод вызывается перед запуском конфигурации.]
я отвечаю слишком поздно на этот вопрос, но кто-то в будущем это пригодится. Приведенный ниже подход, помимо множества других подходов, работает лучше всего, и я лично думаю, что лучше всего подходит для веб-приложения.
@Configuration @EnableWebMvc public class WebConfiguration extends WebMvcConfigurerAdapter { ... other configurations @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); builder.serializationInclusion(JsonInclude.Include.NON_NULL); builder.propertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); builder.serializationInclusion(Include.NON_EMPTY); builder.indentOutput(true).dateFormat(new SimpleDateFormat("yyyy-MM-dd")); converters.add(new MappingJackson2HttpMessageConverter(builder.build())); converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); } }
документация указывает несколько способов сделать это.
если вы хотите заменить стандартный
ObjectMapperокончательно определить@Beanэтого типа и отметьте его как@Primary.определение a
@BeanтипаJackson2ObjectMapperBuilderпозволит вам настроить оба по умолчаниюObjectMapperиXmlMapper(вMappingJackson2HttpMessageConverterиMappingJackson2XmlHttpMessageConverterсоответственно).
spring.jackson.serialization-inclusion=non_nullраньше работал на насно когда мы обновили версию spring boot до 1.4.2.Отпустите или выше, он перестал работать.
Итак, еще одно свойство
spring.jackson.default-property-inclusion=non_nullделает волшебство.в самом деле
serialization-inclusionустарела. Это то, что мой intellij бросает на меня.Не Рекомендуется: ObjectMapper.setSerializationInclusion был осужден в Джексон 2.7
Итак, начните использовать
spring.jackson.default-property-inclusion=non_nullвместо этого
я наткнулся на другое решение, что довольно приятно.
в принципе, только сделать Шаг 2 из блога, опубликованного упомянуто, и определить пользовательский ObjectMapper как Spring
@Component. (Вещи начали работать, когда я просто удалены все материалы AnnotationMethodHandlerAdapter из Шага 3.)@Component @Primary public class CustomObjectMapper extends ObjectMapper { public CustomObjectMapper() { setSerializationInclusion(JsonInclude.Include.NON_NULL); configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } }работает до тех пор, пока компонент находится в пакете, отсканированном весной. (Используя
@Primaryне является обязательным в моем случае, но почему бы не сделать вещи явный.)для меня есть два преимущества по сравнению с другими подход:
- это проще; я могу просто расширить класс от Джексона и не нужно знать о высокоспецифичных вещах, таких как
Jackson2ObjectMapperBuilder.- Я хочу использовать те же конфигурации Джексона для десериализации JSON в другой части моего приложения, и таким образом это очень просто:
new CustomObjectMapper()вместоnew ObjectMapper().
Я нашел решение, описанное выше с :
весна.Джексон.сериализация-включение=non_null
работать только начиная с 1.4.0.Выпуск версии spring boot. Во всех остальных случаях конфигурация игнорируется.
Я проверил это, экспериментируя с модификацией образца spring boot "spring-boot-sample-jersey"
Я знаю вопрос, задающий Spring boot, но я считаю, что многие люди ищут, как это сделать в non Spring boot, например, я ищу почти весь день.
над весной 4, нет необходимости настраивать
MappingJacksonHttpMessageConverterЕсли вы только собираетесь настроитьObjectMapper.нужно сделать:
public class MyObjectMapper extends ObjectMapper { private static final long serialVersionUID = 4219938065516862637L; public MyObjectMapper() { super(); enable(SerializationFeature.INDENT_OUTPUT); } }и в вашей весенней конфигурации создайте этот боб:
@Bean public MyObjectMapper myObjectMapper() { return new MyObjectMapper(); }
вы можете добавить следующий метод внутри вашего bootstrap класса, который аннотируется с
@SpringBootApplication@Bean @Primary public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); objectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false); objectMapper.registerModule(new JodaModule()); return objectMapper; }
Comments