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

Spring Controller返回JSON时UI报406错误求助

解决Spring Controller返回JSON时的406错误问题

首先咱们定位问题根源:你遇到的406错误(客户端无法接受服务器返回的响应格式),本质是Spring没有正确使用JSON序列化器,最终 fallback 返回了text/html类型的响应。核心原因是你同时引入了Jackson 1.x(codehaus)和Jackson 2.x(fasterxml)的依赖,两者产生了版本冲突。

Spring 4.3.x版本默认支持Jackson 2.x作为JSON处理库,但当你同时引入旧版本的Jackson 1.x时,Spring的消息转换器会被搞混,无法确定该用哪个库来序列化对象,最终导致响应格式错误。

下面是具体的解决步骤:

1. 移除Jackson 1.x的依赖

直接删掉Gradle里的Jackson 1.x依赖,因为Spring 4.3.x完全不需要旧版本的Jackson支持:

// 删除这一行旧依赖
// compile "org.codehaus.jackson:jackson-mapper-asl:1.9.13"

2. 补全Jackson 2.x的完整依赖

你已经引入了jackson-core和jackson-databind,建议再显式添加jackson-annotations(虽然databind会间接依赖它,但显式声明能避免依赖缺失问题):

compile "com.fasterxml.jackson.core:jackson-core:2.9.5"
compile "com.fasterxml.jackson.core:jackson-databind:2.9.5"
compile "com.fasterxml.jackson.core:jackson-annotations:2.9.5"

3. 优化Controller代码(可选但更规范)

  • 把produces = MediaType.APPLICATION_JSON_UTF8_VALUE替换为MediaType.APPLICATION_JSON_VALUE,因为Spring 4.3.x中UTF-8已经是JSON响应的默认编码了;
  • 确保getHome(session)返回的对象是可被Jackson序列化的POJO(要有默认构造方法,避免循环引用等问题)。

优化后的Controller代码示例:

@RequestMapping(value = "/portal", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
Object getHomePage(HttpServletRequest request, HttpSession session) {
    return getHome(session);
}

4. 显式配置Jackson 2消息转换器(如果上述步骤无效)

如果移除依赖后问题仍存在,可以手动配置Spring强制使用Jackson 2的消息转换器:

方式1:Java配置类

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 注册Jackson 2的消息转换器
        MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
        converters.add(jacksonConverter);
        super.configureMessageConverters(converters);
    }
}

方式2:XML配置

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

完成这些步骤后,重新构建项目并测试接口,Spring应该会正确返回Content-Type: application/json;charset=UTF-8的响应,406错误也就解决了。

内容的提问来源于stack exchange,提问作者Sandeep Choudhari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:16:50