Как настроить Джексона в Spring Загрузка 1.4

Мне не удалось найти примеры использования Jackson2ObjectMapperBuilderCustomizer.java в spring boot 1.4 для настройки функций Jackson.

Doco для настройки Jackson в загрузке 1.4 - http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-

Моя конфигурация работает, хотя я не уверен, что это правильный способ настройки компоновщика объектов с помощью Jackson2ObjectMapperBuilderCustomizer.java

@Configuration
public class JacksonAutoConfiguration {

    @Autowired
    private Environment env;

    @Bean
    public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder(
        List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
        Jackson2ObjectMapperBuilder builder = configureObjectMapper();
        customize(builder, customizers);
        return builder;
    }

    private void customize(Jackson2ObjectMapperBuilder builder,
                           List<Jackson2ObjectMapperBuilderCustomizer> customizers) {
        for (Jackson2ObjectMapperBuilderCustomizer customizer : customizers) {
            customizer.customize(builder);
        }
    }

    private Jackson2ObjectMapperBuilder configureObjectMapper() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        List<String> activeProfiles = asList(env.getActiveProfiles());
        if (activeProfiles.contains(SPRING_PROFILE_DEVELOPMENT)) {
            builder.featuresToEnable(SerializationFeature.INDENT_OUTPUT);
        }
        return builder;
    }
}

Чтобы обеспечить некоторый контекст, этот класс находится в моем собственном проекте spring для служб REST, который только авто настраивает несколько вещей, таких как ControllerAdvice и некоторые тривиальные функции, подобные описанным выше.

Итак, моя цель - расширить конфигурацию Jackson, а не переопределять любую конфигурацию, предоставляемую загрузкой или другими пакетами.

Ответы

Ответ 1

Чтобы настроить Jackson ObjectMapper, который уже был предварительно настроен с помощью Spring Boot, я смог это сделать (пример здесь - добавить пользовательский десериализатор).

Класс конфигурации:

@SpringBootConfiguration
public class Application {

    @Autowired
    private BigDecimalDeserializer bigDecimalDeserializer;

    ...

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer addCustomBigDecimalDeserialization() {
        return new Jackson2ObjectMapperBuilderCustomizer() {

            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
                jacksonObjectMapperBuilder.deserializerByType(BigDecimal.class, bigDecimalDeserializer);
            }

        };
    }

    ...

}

И мой пользовательский десериализатор, чтобы показать, как он подхватил Spring:

@Component
public class BigDecimalDeserializer extends StdDeserializer<BigDecimal> {

    public BigDecimalDeserializer() {
        super(BigDecimal.class);
    }

    @Override
    public BigDecimal deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        ...
    }

    ...

}

Ответ 2

Это зависит от того, что вы пытаетесь сделать.

Если вы хотите сделать некоторые настройки в дополнение к тем, которые выполняются по умолчанию, вы должны создать свою собственную реализацию Jackson2ObjectMapperBuilderCustomizer и выставить ее как bean. То, что у вас сейчас есть, является более сложной версией этого. Вместо того, чтобы вводить пользовательские настройки, а затем вызывать их самостоятельно, вы можете просто создать свой собственный настраиватель bean, и Boot будет вызывать его для вас.

Если вы хотите полностью контролировать и отключать все настройки загрузки, создайте Jackson2ObjectMapperBuilder или ObjectMapper bean и настройте его по мере необходимости. Подход строителя предпочтительнее, так как этот строитель затем также используется для настройки объектов ObjectMappers, созданных другими компонентами, такими как Spring Data REST.

Если вы посмотрите на свой код и сделаете шаг назад, вы можете настроить гораздо проще, используя конфигурационный файл, специфичный для профиля (например, application-dev.properties), чтобы включить отступ вывода Jackson. Вы можете узнать больше об этом здесь.

Ответ 3

просто создайте ObjectMapper bean:

@Bean
ObjectMapper objectMapper() {
    return Jackson2ObjectMapperBuilder
            .json()
            .featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION)
            .build();
}