gpt4 book ai didi

spring-boot - 为什么 Spring Boot 不使用 @Primary Jackson ObjectMapper 在 rest Controller 上进行 JSON 序列化?

转载 作者:行者123 更新时间:2023-12-04 15:06:57 26 4
gpt4 key购买 nike

我设置了一个类来返回一个自定义的 ObjectMapper。据我所知,让 Spring Boot 使用这个 ObjectMapper 的正确方法是将它声明为 @Primary,它就是这样。

@Configuration
public class MyJacksonConfiguration {

@Bean
@Primary
public ObjectMapper objectMapper() {
return Jackson2ObjectMapperBuilder
.json()
.findModulesViaServiceLoader(true)
.mixIn(Throwable.class, ThrowableMixin.class)
.featuresToDisable(
WRITE_DATES_AS_TIMESTAMPS)
.serializationInclusion(
Include.NON_ABSENT)
.build();
}
}

但是,当我从 Controller 方法返回一个对象时,它会使用默认的 Jackson ObjectMapper 配置进行序列化。

如果我向我的 Controller 添加一个显式 ObjectMapper 并在其上调用 writeValueAsString,我可以看到这个 ObjectMapper 是我希望 Spring Boot 使用的自定义对象。
@RestController
public class TestController {

@Autowired
private TestService service;

@Autowired
private ObjectMapper mapper;

@GetMapping(value = "/test", produces = "application/json")
public TestResult getResult() {

final TestResult ret = service.getResult();

String test = "";
try {
test = mapper.writeValueAsString(ret);
// test now contains the value I'd like returned by the controller!
} catch (final JsonProcessingException e) {
e.printStackTrace();
}

return ret;
}
}

当我在我的 Controller 上运行测试时,测试类也使用 Autowiring 的 ObjectMapper。同样,提供给测试的 ObjectMapper 是定制的。

所以 Spring 在某种程度上知道自定义的 ObjectMapper,但它没有被我的其余 Controller 类使用。

我曾尝试为 Spring 打开调试日志记录,但在日志中看不到任何有用的内容。

知道可能会发生什么,或者我应该在哪里寻找追踪问题?

编辑 :似乎有多种方法可以做到这一点,但是我尝试这样做的方式似乎是一种推荐的方法,我想让它以这种方式工作 - 参见 https://docs.spring.io/spring-boot/docs/1.4.7.RELEASE/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper 的 71.3 - 我是不是误会了什么?

最佳答案

虽然其他答案显示了实现相同结果的替代方法,但这个问题的实际答案是我定义了一个扩展 WebMvcConfigurationSupport 的单独类。 .通过这样做WebMvcAutoConfiguration bean 已被禁用,因此 @Primary ObjectMapper 没有被 Spring 接收。 (在 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) source 中查找 WebMvcAutoConfiguration 。)

暂时删除扩展类 WebMvcConfigurationSupport允许 @Primary ObjectMapper被 Spring 按预期使用。

因为我无法删除 WebMvcConfigurationSupport永久扩展类,我改为添加以下内容:

@Autowired
private ObjectMapper mapper;

@Override
public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter(mapper));
addDefaultHttpMessageConverters(converters);
super.configureMessageConverters(converters);
}

关于spring-boot - 为什么 Spring Boot 不使用 @Primary Jackson ObjectMapper 在 rest Controller 上进行 JSON 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390931/

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