Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient
Posted
技术标签:
【中文标题】Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient【英文标题】:Spring Boot auto-configured Jackson ObjectMapper not used for WebFlux WebClient by default 【发布时间】:2020-06-05 17:18:08 【问题描述】:在我的 Spring Boot 应用程序中,我使用响应式 WebFlux WebClient 从 SSE(服务器发送事件)端点检索流式 JSON 数据。按照official docs 的建议,通过在Spring Boot 中设置spring.jackson.deserialization.read-date-timestamps-as-nanoseconds=false
之类的配置选项来修改默认的自动配置Jackson ObjectMapper 行为对WebFlux WebClient 没有影响。我还尝试了SO thread 中列出的其他建议,例如为 WebFlux 配置创建自定义 bean,但它们没有帮助,配置仍然没有被拾取。
【问题讨论】:
【参考方案1】:在调试 Spring WebFlux / Jackson 库代码相当长的一段时间后,我终于能够通过查看响应式 WebFlux WebClient docs 找到解决问题的提示。使 WebClient 使用默认的自动配置 Jackson ObjectMapper 需要一些自定义管道。解决方案是在创建 WebClient 的新实例时配置用于处理服务器发送事件的默认解码器。下面是示例代码:
@Component
public class MarketDataFetcher implements CommandLineRunner
// ...
private final WebClient webClient;
public MarketDataFetcher(ObjectMapper objectMapper)
webClient = createWebClient(objectMapper);
private WebClient createWebClient(ObjectMapper objectMapper)
return WebClient.builder()
.codecs(configurer -> configurer.defaultCodecs()
.serverSentEventDecoder(new Jackson2JsonDecoder(objectMapper)))
.baseUrl(BASE_URL)
.build();
ObjectMapper
是Spring自动注入的,所以不需要@Autowired
注解。
如果可以在官方文档中以某种方式更明确地说明这一点,那肯定会有所帮助。希望这个答案对面临类似问题的人有用!
【讨论】:
类似的问题已经被问到这个问题 -> ***.com/q/43769301/11251146以上是关于Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot与Jackson ObjectMapper
Spring Boot:Jackson 不会从“application.properties”中获取配置
Spring MVC 接收的 JSON 嵌套对象的 Spring Boot JACKSON 配置
如何用 jsoniter 将 Spring Boot 应用程序中的 jackson 替换为自动编组器和解组器