Spring Boot从2.7.14升级至3.2.4后出现415不支持媒体类型问题
首先注意你提供的代码中存在拼写错误:@Configuartion应为@Configuration,RestTemplae应为RestTemplate,确保实际运行代码中没有此类问题。
以下是针对你遇到问题的排查方向和解决方案:
1. 检查并显式配置消息转换器
Spring Boot 3.x(基于Spring Framework 6)对RestTemplate的默认消息转换器配置做了调整,可能导致JsonNode类型的请求体处理逻辑变化。建议显式添加并优先使用Jackson消息转换器:
修改你的RestTemplateConfiguration:
@Configuration public class RestTemplateConfiguration { @Bean public RestTemplate restTemplate(RestTemplateFactory restTemplateFactory) { RestTemplate restTemplate = restTemplateFactory.restTemplate(); // 显式配置Jackson消息转换器,确保优先处理JSON类型 MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); jacksonConverter.setSupportedMediaTypes(Arrays.asList( MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8, MediaType.TEXT_PLAIN )); // 将Jackson转换器放到消息转换器列表最前面,确保优先被使用 restTemplate.getMessageConverters().add(0, jacksonConverter); SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setOutputStreaming(false); ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(requestFactory); restTemplate.setRequestFactory(factory); // 暂时注释拦截器,排查是否是拦截器导致的问题 // restTemplate.getInterceptors().add(new AddResponseBodyWrapperInterceptor()); return restTemplate; } }
2. 排查请求Content-Type隐式设置问题
当HttpEntity的body为null时,Spring Boot 3.x的RestTemplate可能会隐式添加不符合服务端要求的Content-Type头。建议在创建HttpEntity时,若body为空,显式清空Content-Type:
// 示例:创建空body的HttpEntity时,确保不携带Content-Type HttpHeaders headers = new HttpHeaders(); // 移除可能自动添加的Content-Type headers.remove(HttpHeaders.CONTENT_TYPE); HttpEntity<JsonNode> httpEntity = new HttpEntity<>(null, headers);
3. 验证拦截器兼容性
你的AddResponseBodyWrapperInterceptor可能在Spring 6环境下存在兼容性问题,比如修改了请求头或请求体的处理逻辑。暂时注释掉拦截器配置,测试请求是否正常,以此排除拦截器的影响。
4. 检查服务端实际接收的请求细节
虽然客户端日志显示请求头一致,但建议查看服务端的访问日志,确认实际接收到的Content-Type、Accept等头信息是否与预期一致。某些情况下,客户端日志可能无法捕获框架自动添加的头信息。
5. 确认Jackson依赖与配置
Spring Boot 3.x依赖Jackson 2.15+版本,若你的项目中有自定义的Jackson配置(如ObjectMapper Bean),需确认其配置是否与Spring 6兼容,比如是否启用了正确的序列化/反序列化特性。
内容的提问来源于stack exchange,提问作者Vivek

