当前位置: 首页 > 知识库问答 >
问题:

如何在spring boot定制jackson 1.4

卫鸿朗
2023-03-14

我一直找不到如何在spring boot 1.4中使用Jackson2ObjectMapperBuilderCustomizer.定制jackson特性的示例。

Boot1.4中自定义jackson的DOCO-https://docs.spring.io/spring-boot/docs/1.4.x/reference/htmlsingle/#howto-customize-the-对象映射器

我的配置工作正常,尽管我不确定这是否是使用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 starter项目中,该项目只是自动配置一些东西,如ControllerAdvice和一些琐碎的特性,如上面所述。

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

共有2个答案

谢阳成
2023-03-14

这取决于你想做什么。

如果您想在默认情况下执行的自定义之外进行一些自定义,那么您应该创建自己的Jackson2ObjectMapperBuilderCustomizer实现并将其公开为bean。您目前拥有的是一个更复杂的版本。您可以创建自己的定制器bean,并由Boot为您调用它,而不是注入定制器然后自己调用它们。

如果您想要完全控制并关闭所有的boot自定义,那么创建一个jackson2objectmapperbuilderobjectmapperbean并根据需要进行配置。builder方法是首选的,因为这个builder还用于配置由其他组件创建的ObjectMappers,例如spring数据REST。

回顾一下您的代码,退一步来看,您可以通过使用特定于配置文件的配置文件(类似于application-dev.properties)来实现对jackson输出的缩进,从而更加简单地配置事情。你可以在这里读到更多关于它的内容。

白星腾
2023-03-14

为了自定义已经由spring boot预先配置的jacksonobjectmapper,我可以这样做(这里的示例是添加一个自定义反序列化器)。

配置类:

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

    ...

}
 类似资料:
  • 问题内容: 可以改变外观吗? 问题答案: 您不能对控件本身进行太多修改。 由于单击与输入正确配对的元素会激活/聚焦它,因此我们可以使用a 触发OS浏览对话框。 这是您的操作方法… 表单控件的CSS将使它看起来不可见,并且不会在文档布局中占用空间,但是仍然 存在, 因此可以通过激活它。 如果要在选择后显示用户选择的路径,可以使用JavaScript侦听事件,然后读取浏览器提供给您的路径(出于安全原因

  • 我有一个简单的SpringBoot应用程序,其结构如下: 我使用的是标准应用程序。yml文件,其中存储了所有必要的道具,并在必要时使用@ConfigurationProperties注释注入它们。 现在对于一个bean,我有很多道具,我不想压倒我的普通应用程序。yml文件和所有的道具。所以我想要一个单独的(我把它放在类路径中的service dir下)。 根据Spring文档,我可以使用这样的东西

  • 在spring boot中@RequestBody内容到达控制器之前,我如何覆盖它? > 此外,我还搜索了Request estBodyAdviceAdapter。 有几个链接对spring boot不起作用。 如何多次读取request.getInputStream() 如何在Spring引导到达控制器之前修改请求正文 现在,我可以将输入流读入字符串中,进行一些修改并设置回控制器的输入流吗?

  • 我在学习Spring Boot时遇到了一些编码问题;我想添加一个像Spring3.x那样的CharacterEncodingFilter。就像这样:

  • 10.1 配置日志 10.1.1 在配置文件中配置 在application.properties中添加 server.tomcat.accesslog.enabled=true server.tomcat.accesslog.directory=d:/temp/logs 10.2 EmbeddedServletContainerCustomizer接口,通过代码配置tomcat package

  • 因此,我正在进行我的第一个Spring Boot项目,我一直在进行测试。我查了很多例子,但似乎都不管用。 这是我的控制器的当前测试: 这是可行的,但在sonarqube上,我发现我的代码覆盖率为0%,而我似乎找不到一个测试,它的覆盖率甚至超过了零。有谁能给我一个关于如何为控制器编写一个好的单元测试的例子,然后我就可以根据您的例子自己解决这个问题。 这是我的控制器: 这是我的服务(以防您需要): 还