怎么解决springMVC中直接用@ResponseBody报406错误问题

发布时间:2021-11-17 16:09:14 作者:iii
来源:亿速云 阅读:227
# 怎么解决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等测试工具中,需要明确设置这个请求头。

方案四:使用produces属性

在Controller方法上明确指定produces:

@GetMapping(value = "/user/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public User getUser(@PathVariable Long id) {
    return userService.findById(id);
}

进阶排查技巧

1. 查看已注册的MessageConverter

添加以下代码检查当前生效的转换器:

@Autowired
private RequestMappingHandlerAdapter adapter;

@PostConstruct
public void init() {
    List<HttpMessageConverter<?>> converters = 
        adapter.getMessageConverters();
    converters.forEach(System.out::println);
}

2. 调试DispatcherServlet

org.springframework.web.servlet.DispatcherServlet#doDispatch方法中设置断点,观察请求处理流程。

常见误区

  1. 仅添加jackson-core:必须同时添加jackson-databind才能正常工作
  2. 版本冲突:注意Spring版本与Jackson版本的兼容性
  3. XML配置遗漏:如果使用XML配置,需要添加<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优化的技术文章要求。

推荐阅读:
  1. 好程序员Java分享SpringMVC之@ResponseBody注解
  2. SpringMvc返回@ResponseBody出现中文乱码该怎么办

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring mvc @responsebody

上一篇:Knockout应用开发中如何创建自定义绑定

下一篇:jquery如何获取tr里面有几个td

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》