RestClient 自定义 JSON 后没了默认转换器:7.0 显式 registerDefaults
Spring Framework 7.0 使用 configureMessageConverters 后,默认转换器可能不再注册。需要保留默认集合时,在 consumer 中先调用 registerDefaults。
手工创建 RestClient,加入 configureMessageConverters 定制 JSON 后,原来能处理的响应类型却没有合适转换器。Spring Framework 7.0 的这条配置路径会从空的转换器构建器开始;要保留默认集合,应在 consumer 中显式调用 registerDefaults()。
正式 7.0.7 的实现仍保留这条空构建器路径。Spring Boot 自动配置的 RestClient.Builder 已有自己的默认注册,是否受影响要看实际创建入口。
在定制前注册需要的默认项
下面是 Spring 7 的构建片段,jsonMapper 为项目已配置的 Jackson 3 JsonMapper:
RestClient client = RestClient.builder()
.configureMessageConverters(converters -> converters
.registerDefaults()
.withJsonConverter(
new JacksonJsonHttpMessageConverter(jsonMapper)))
.build();
相应类型是 org.springframework.web.client.RestClient 与 org.springframework.http.converter.json.JacksonJsonHttpMessageConverter。这段应合并到原 client 的配置中,保留认证、基础地址、拦截器和超时,不要用空白 builder 替换整套现有设置。
withJsonConverter 设置 JSON 转换器,不等于把所有默认类型一并注册。若业务有意只允许特定转换器,应保持那份限制,不应为消除一条异常无条件恢复全部默认能力。
mutate 也要核对构建过程
从已有 client 调用 mutate() 后继续配置,不应假定得到的是已经物化、可直接修改的完整默认转换器列表。这条实现保留的是相应配置过程;新增 configurer 后同样需要核对默认注册。
configureMessageConvertersList 用于修改最终列表,不能凭它的名字推断列表一定非空。先确定默认项是否已经注册,再在列表层做替换或过滤,避免遍历一个空列表却以为定制成功。
7.1 拟调整为默认注册并允许显式禁用;这里不把它视为已经发布的正式行为。后续升级须对照实际正式版本重新审查配置,避免保留与新默认行为相冲突的冗余定制。
验证时让原 client 分别处理业务需要的 JSON、字符串或字节响应,确认实际选中的转换器及自定义 mapper 行为。只直接调用 mapper 成功,无法证明 HTTP 消息转换链完整;也不要把读取超限等其他错误归到这条配置路径。


