您好,登录后才能下订单哦!
# 怎么解决SpringMVC中直接用@ResponseBody报406错误问题
## 问题现象描述
在使用SpringMVC框架开发时,当我们直接在Controller方法上使用`@ResponseBody`注解返回JSON数据时,可能会遇到HTTP 406(Not Acceptable)错误。控制台通常会显示类似如下的错误信息:
HTTP Status 406 - The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request “Accept” headers.
## 错误原因分析
### 1. 缺少JSON转换器
Spring MVC需要相应的消息转换器(MessageConverter)将Java对象转换为JSON格式。如果没有正确配置`MappingJackson2HttpMessageConverter`等JSON转换器,框架无法处理`@ResponseBody`的转换请求。
### 2. 客户端Accept头不匹配
当客户端(如浏览器或Postman)的HTTP请求头中`Accept`字段不包含`application/json`时,Spring可能拒绝返回JSON格式响应。
### 3. 依赖缺失
项目中没有引入Jackson或GSON等JSON处理库,导致Spring无法找到可用的消息转换器。
## 解决方案
### 方案一:添加必要的依赖(Maven示例)
```xml
<!-- Jackson核心依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
<!-- 如果使用Spring 5.x+ -->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.12.3</version>
</dependency>
在Spring MVC配置类中添加:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
.indentOutput(true)
.dateFormat(new SimpleDateFormat("yyyy-MM-dd"))
.modulesToInstall(new JavaTimeModule());
converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}
}
确保客户端请求包含正确的Accept头:
GET /api/user/1 HTTP/1.1
Accept: application/json
在Postman等测试工具中,需要明确设置这个请求头。
在Controller方法上明确指定produces:
@GetMapping(value = "/user/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
添加以下代码检查当前生效的转换器:
@Autowired
private RequestMappingHandlerAdapter adapter;
@PostConstruct
public void init() {
List<HttpMessageConverter<?>> converters =
adapter.getMessageConverters();
converters.forEach(System.out::println);
}
在org.springframework.web.servlet.DispatcherServlet#doDispatch
方法中设置断点,观察请求处理流程。
<mvc:annotation-driven/>
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public List<User> listUsers() {
return Arrays.asList(
new User(1, "张三"),
new User(2, "李四")
);
}
}
// Spring Boot启动类
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
解决Spring MVC中@ResponseBody
返回406错误的关键在于:
1. 确保正确配置了JSON消息转换器
2. 检查依赖是否完整
3. 验证请求/响应的Content-Type设置
4. 使用produces明确指定响应类型
通过以上方法,可以彻底解决这个常见的开发问题,确保RESTful接口正常返回JSON数据。 “`
这篇文章从问题现象、原因分析到解决方案提供了完整的技术指导,涵盖了依赖配置、代码示例和调试技巧,符合SEO优化的技术文章要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。