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

Spring 5.0.4 & Jackson2启动抛异常,REST接口返回406错误求助

解决REST控制器返回406 HTTP错误的方案

首先,406错误的核心原因是服务器无法生成客户端请求中Accept头指定的媒体类型响应。结合你提供的代码片段,我整理了几个实用的排查和修复方向:

1. 确认JSON序列化依赖是否齐全

如果是Spring项目,必须确保引入了JSON序列化的核心依赖(比如Jackson)——没有它的话,即使你指定了produces = application/json,Spring也没法把UserInfo对象转换成JSON格式的响应。

Maven依赖示例:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

Gradle依赖示例:

implementation 'com.fasterxml.jackson.core:jackson-databind'

2. 简化@GetMapping的媒体类型配置

你同时设置了headers = "Accept=application/json"和produces,这两个配置功能重叠甚至可能冲突。建议做如下调整:

  • 方案一:只保留produces(更简洁,推荐)
@GetMapping(value = "/getUser/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<Object> getUser(@PathVariable(value = "id")Long id) {
    if (id == null) return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    UserInfo userInfo = userService.get(id);
    if (userInfo == null) return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    return new ResponseEntity<>(userInfo, HttpStatus.OK);
}

(注:APPLICATION_JSON_UTF8_VALUE已被废弃,改用APPLICATION_JSON_VALUE即可,Spring会自动处理编码问题)

  • 方案二:如果一定要保留headers,请确保客户端实际发送的Accept头完全匹配,或者改用更宽松的匹配规则(比如headers = "Accept=*/*",仅适合特殊场景)

3. 检查UserInfo类的序列化兼容性

Jackson序列化需要UserInfo满足基础要求:

  • 类必须包含无参构造函数(Jackson默认依赖它实例化对象)
  • 私有字段必须有对应的getter方法(否则无法被序列化)
  • 特殊字段(如日期、枚举)可以用@JsonFormat等注解指定序列化规则

4. 验证客户端请求的Accept头

用Postman、curl等工具确认客户端实际发送的Accept头是否符合接口要求。比如用curl测试:

curl -H "Accept: application/json" http://你的服务地址/getUser/1

如果客户端发送的Accept头是text/html或其他非JSON类型,而你的接口只接受application/json,就会触发406错误。

5. 排查Spring消息转换器配置

如果你的项目手动配置了消息转换器,请确保没有排除MappingJackson2HttpMessageConverter——这个转换器是Spring将Java对象转为JSON响应的核心组件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:35:19