在 Spring Boot 应用程序中配置 Jackson mixin

dka*_*ras 6 java mixins jackson spring-boot jackson2

我为我的班级创建了一个 mixin。mixin 本身工作得很好,这不是大多数人在混合 faterxml/codehaus 注释时遇到的问题。我在单元测试中对其进行了测试,在使用 addMixIn 方法时“手动”创建 ObjectMapper - 它工作得很好。

我想使用该 mixin 来修改从 REST 端点返回的响应 json。我尝试以多种不同的方式自定义 Spring Boot 的 ObjectMapper:

构建器定制器:

@Bean
public Jackson2ObjectMapperBuilderCustomizer addMixin(){
    return new Jackson2ObjectMapperBuilderCustomizer() {
        @Override
        public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
            jacksonObjectMapperBuilder.mixIn(MyClass.class, MyClassMixin.class);                
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

建造者:

@Bean
Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder().mixIn(MyClass.class, MyClassMixin.class);
}
Run Code Online (Sandbox Code Playgroud)

转换器:

@Bean
public MappingJackson2HttpMessageConverter configureJackson(){
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();
    mapper.addMixIn(MyClass.class, MyClassMixin.class);
    converter.setObjectMapper(mapper);
    return converter;
}
Run Code Online (Sandbox Code Playgroud)

对象映射器:

@Autowired(required = true)
public void configureJackon(ObjectMapper jsonMapper){
    jsonMapper.addMixIn(MyClass.class, MyClassMixin.class);
}
Run Code Online (Sandbox Code Playgroud)

这些都不起作用。

pix*_*xel 5

从 Spring Boot 2.7 开始,内置了对 mixins 的支持。

添加以下注释:

@JsonMixin(MyClass::class)
class MyClassMixin{
Run Code Online (Sandbox Code Playgroud)

将在自动配置的ObjectMapper.


Kar*_*cki 3

这可能取决于 Spring Boot 版本,但根据自定义 Jackson ObjectMapper定义一个新Jackson2ObjectMapperBuilderCustomizerbean 就足够了

\n\n
\n

context\xe2\x80\x99s Jackson2ObjectMapperBuilder 可以通过一个或多个 Jackson2ObjectMapperBuilderCustomizer bean 进行定制。可以对此类定制器 bean 进行排序(Boot\xe2\x80\x99s 自己的定制器的顺序为 0),从而可以在 Boot\xe2\x80\x99s 定制之前和之后应用其他定制。

\n
\n