Spring REST API自定义Accept头与返回类型引发406状态码问题
问题分析与解决方案
这个问题我之前碰到过类似的情况,核心原因是Spring默认的XML消息转换器并不认识你自定义的project/xml媒体类型:当返回自定义Response对象时,Spring找不到能处理该媒体类型的转换器来完成XML序列化,因此抛出406 Not Acceptable错误;而/end端点返回的是ResponseEntity<String>,StringHttpMessageConverter默认支持所有媒体类型,所以能正常响应。
下面是具体的解决步骤:
1. 配置XML消息转换器支持自定义媒体类型
修改你的Spring配置类,给MappingJackson2XmlHttpMessageConverter添加自定义媒体类型的支持,让它能识别project/xml:
@Configuration @EnableWebMvc @ComponentScan(basePackages = "com.project") public class BeanConfiguration implements WebMvcConfigurer { @Bean public MappingJackson2XmlHttpMessageConverter xmlMessageConverter() { MappingJackson2XmlHttpMessageConverter converter = new MappingJackson2XmlHttpMessageConverter(); // 注册自定义的XML媒体类型 MediaType customXmlMediaType = MediaType.valueOf("project/xml; charset=utf-8"); // 同时保留对标准application/xml的支持 converter.setSupportedMediaTypes(Arrays.asList(customXmlMediaType, MediaType.APPLICATION_XML)); return converter; } @Bean public MappingJackson2HttpMessageConverter jsonMessageConverter() { return new MappingJackson2HttpMessageConverter(); } // 重写该方法,手动注册消息转换器(确保Spring使用我们配置的版本) @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(xmlMessageConverter()); converters.add(jsonMessageConverter()); // 保留String转换器,确保/end这类返回字符串的端点正常工作 converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); } }
2. 验证配置匹配性
确保控制器类上的produces属性和你配置的媒体类型完全一致:
@RequestMapping(value = "/wa", produces = "project/xml; charset=utf-8")
这里的格式(包括charset=utf-8)要和配置中customXmlMediaType的定义完全匹配,避免Spring因为媒体类型不精确匹配而拒绝响应。
3. 为什么之前的尝试无效?
- 让
Response继承ResponseEntity没用:问题根源不在返回类型本身,而在消息转换器对自定义媒体类型的支持,继承并不能让Spring识别新的媒体类型。 - 移除
produces或改用application/xml正常:因为Spring默认的XML转换器本来就支持标准的application/xml,此时能找到对应的转换器完成序列化。
完成以上配置后,重启应用,用Postman发送Accept: project/xml请求/wa/start端点,就能正常返回包裹在<response>标签内的XML响应了。
内容的提问来源于stack exchange,提问作者D. Naumovich
相关产品推荐
相关产品推荐

