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
相关产品推荐
相关产品推荐

