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

