java - 如何在 Spring Boot 1.4 中自定义 Jackson

标签 java spring spring-boot jackson

我一直无法找到如何在 spring boot 1.4 中使用 Jackson2ObjectMapperBuilderCustomizer.java 来自定义 Jackson 的功能的示例。

在 boot 1.4 中自定义 Jackson 的文档 - https://docs.spring.io/spring-boot/docs/1.4.x/reference/htmlsingle/#howto-customize-the-jackson-objectmapper

我的配置有效,但我不确定这是否是使用 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;
    }
}

为了提供一些上下文,这个类位于我自己的 REST 服务 spring 启动项目中,它只是自动配置许多东西,比如 ControllerAdvice 和一些像上面这样的琐碎功能。

所以我的目标是扩展 Jackson 配置,而不是覆盖 boot 或其他包提供的任何配置。

最佳答案

要自定义 Spring Boot 已经预先配置的 Jackson ObjectMapper,我能够做到这一点(这里的示例是添加自定义反序列化器)。

配置类:

@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 {
        ...
    }

    ...

}

关于java - 如何在 Spring Boot 1.4 中自定义 Jackson,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39263553/

相关文章:

java - 如何在 Spring Boot 的构造函数中读取 application.properties 值?

java - 无法在 Spring Boot 2.0.0 中 Autowiring 身份验证管理器

spring - 我可以使用 spring boot 数据源来获取连接对象,以便手动将其与 conn.executeQuery() 一起使用吗?

java - 无法看到我绘制的所有图像并且无法让 JScrollPane 工作

java - 从 Data Provider 返回一个 Map 迭代器

java - 写入文件 - 哪种方式更干净?

java - 如何在vaadin中设置图像数据源

java - 如何在 Spring Security 3.1 中使用 acl_entry 表中的 mask 字段?

node.js - 如何在本地运行的 Web 服务之间进行通信

java - 将自定义 AccessDecisionManager 与 HttpSecurity addFilterBefore 一起使用不起作用