gpt4 book ai didi

spring-boot - 是否可以在 Spring Boot 中注册 Controller 特定的 ObjectMapper

转载 作者:行者123 更新时间:2023-12-04 11:30:04 24 4
gpt4 key购买 nike

我们有一个用例,其中端点返回的 JSON 必须根据端点进行不同的序列化。是否可以注册两个单独的 ObjectMapper bean 并指定哪个用于特定 Controller ?例如,如果我定义一个如下所示的自定义对象映射器,我是否可以要求 Spring Boot 使用此映射器仅序列化来自 ControllerTwo 的返回对象,但使用默认/主要对象映射器来序列化从 ContorllerOne 返回的对象?

    @Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper mapper = builder.build();
return mapper;
}

@Bean
public ObjectMapper objectMapperCustom(Jackson2ObjectMapperBuilder builder) {
ObjectMapper mapper = builder.build();
//customize mapper
return mapper;
}

@RestController
public class ControllerOne {

@GetMapping("/personNew/{id}")
public Person getMyClass() {

}
}

@RestController
public class ControllerTwo {

@GetMapping("/personOld/{id}")
public Person getMyClass() {

}
}

最佳答案

截至 2021 年未答复意味着仍然不可能(容易)为相同的媒体/对象/响应类型使用替代的 ObjectMapper。 IE。
不,不可能(容易):

... register Controller specific ObjectMapper in SpringBoot


(..不是没有“重新实现” 的一半)。
但是什么是(容易)可能的:
是注册 定制 ObjectMapper 每个 java 和媒体类型 (组合!+媒体类型的通配符)! (除了 Spring 配置的“默认对象映射器”)
和:
//no bean
private ObjectMapper fooMapper() {
return new ObjectMapper()
.configure(SerializationFeature.WRAP_ROOT_VALUE, true)
.configure(SerializationFeature.INDENT_OUTPUT, false)
.setDateFormat(new SimpleDateFormat("dd.MM.yyyy hh:mm:ss"));
}

//no bean
private ObjectMapper barMapper() {
return new ObjectMapper()
.configure(SerializationFeature.WRAP_ROOT_VALUE, true)
.configure(SerializationFeature.INDENT_OUTPUT, false)
.setDateFormat(new SimpleDateFormat("MM/dd/yyyy K:mm:ss a"));
}
我们可以做的:
@Bean //overwrites the autoconfigured 
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
@Autowired ObjectMapper objectMapper // auto- and property configured, when no (alternative) ObjectMapper bean is defined.
) {
MappingJackson2HttpMessageConverter bean = new MappingJackson2HttpMessageConverter();
// set "the default":
bean.setObjectMapper(objectMapper);

// register custom:
bean.registerObjectMappersForType(Foo.class, m -> { //!!
m.put(MediaType.APPLICATION_JSON, fooMapper());
// ...
});
bean.registerObjectMappersForType(Bar.class, m -> {
m.put(MediaType.APPLICATION_JSON, barMapper());
});
return bean;
}
这里的诀窍是不要让 (直接)管理对象映射器,但要注册“普通映射器”,因为一旦存在 ObjectMapper bean,将跳过所有“ spring.jackson.* 魔法”。
  • registerObjectMappersForType - javadoc
  • A complete sample@github .

  • 实现(例如) Person 的自定义“ View ” , 介绍 (2014) JSON Views .

    关于spring-boot - 是否可以在 Spring Boot 中注册 Controller 特定的 ObjectMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66586645/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com