Как настроить 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.

835   9  

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

    Ничего не найдено.