You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:40:39