Spring Boot 3.2 RestClient迁移:自定义ObjectMapper与内存配置问题
1. 是否必须清空消息转换器列表?
不需要强制清空。
Spring Boot 3.2 的 RestClient 会自动复用 Spring 容器里配置的全局 HttpMessageConverters——只要你已经把自定义的 kebab-case 风格 ObjectMapper 注册为 Bean,对应的 MappingJackson2HttpMessageConverter 就已经包含在默认转换器列表里了,RestClient 会直接用它。
只有当你想完全替换所有默认转换器(比如不想用默认的字符串、字节数组转换器等)时,才需要调用 messageConverters() 清空列表后重新添加。如果只是确保用自己的 ObjectMapper,完全不用做清空操作。
举个手动配置转换器的例子(无需清空):
@Bean public RestClient restClient(ObjectMapper customKebabCaseObjectMapper) { MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(customKebabCaseObjectMapper); return RestClient.builder() .messageConverters(converters -> { // 把自定义转换器放在最前面,确保优先使用 converters.add(0, jacksonConverter); }) .build(); }
2. 如何设置 maxInMemorySize?需要设置吗?
先明确对应关系
你之前在 WebClient 里给 Jackson2JsonDecoder 设置的 maxInMemorySize,是限制响应体在内存中的最大缓存大小;在同步的 RestClient 里,对应的是 AbstractHttpMessageConverter 的 maxInMemorySize 属性,作用完全一致——防止大响应体撑爆内存。
设置方法有两种:
方法一:配置文件全局生效
直接在 application.yml 里加一行,所有 RestClient 实例都会用这个配置:
spring: web: client: rest-client: max-in-memory-size: 10MB
方法二:代码自定义单个实例
如果只想给特定的 RestClient 实例设置,构建时找到对应的转换器修改参数即可:
@Bean public RestClient customServiceRestClient(ObjectMapper customKebabCaseObjectMapper) { return RestClient.builder() .messageConverters(converters -> { // 给已有的 Jackson 转换器设置内存上限 converters.stream() .filter(c -> c instanceof MappingJackson2HttpMessageConverter) .forEach(c -> ((MappingJackson2HttpMessageConverter) c).setMaxInMemorySize(10 * 1024 * 1024)); // 或者直接添加自定义的转换器并设置参数 MappingJackson2HttpMessageConverter customConverter = new MappingJackson2HttpMessageConverter(customKebabCaseObjectMapper); customConverter.setMaxInMemorySize(10 * 1024 * 1024); converters.add(0, customConverter); }) .build(); }
是否必须设置?
Spring Boot 3.2 中 RestClient 的默认 maxInMemorySize 是 2MB,如果你之前在 WebClient 里设置 10MB 是因为要处理大于 2MB 的响应体,那迁移后必须同步设置,否则会出现响应体过大无法解析的错误;如果你的接口返回都小于 2MB,也可以不设置,但建议保持和之前一致的配置,避免后续接口调整出问题。
内容的提问来源于stack exchange,提问作者Wim Deblauwe

