0

0

Spring REST API 406 错误:内容协商与解决方案

心靈之曲

心靈之曲

发布时间:2025-08-31 17:41:01

|

758人浏览过

|

来源于php中文网

原创

Spring REST API 406 错误:内容协商与解决方案

本文旨在深入解析Spring REST API中常见的HTTP状态码406 (Not Acceptable) 错误,该错误通常发生在服务器无法根据客户端的Accept头找到合适的资源表示形式时。教程将详细阐述错误产生的原理,并通过添加@GetMapping和@PostMapping注解中的produces和consumes属性来明确指定API支持的媒体类型,从而提供一个清晰、专业的解决方案,确保Spring应用能够正确地进行内容协商,实现预期的JSON响应。

理解HTTP 406 Not Acceptable 错误

在spring restful api开发中,http 406 not acceptable 错误是一个常见的挑战,尤其是在处理客户端与服务器之间的内容协商时。当客户端发送一个请求,并在其accept请求头中声明了它能够处理的媒体类型(例如application/json或application/xml),而服务器端却无法生成任何符合这些媒体类型的响应时,就会返回406状态码。

错误堆栈信息通常会显示org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation,这明确指出Spring MVC的消息转换器无法找到一个可以将控制器方法返回值转换为客户端可接受格式的处理器。即使项目中引入了Jackson等JSON处理库的依赖,如果Spring无法正确识别或应用这些转换器,问题依然会存在。

错误原因分析

Spring MVC通过HttpMessageConverter接口处理HTTP请求和响应体的序列化与反序列化。当一个控制器方法返回一个Java对象时,Spring会尝试使用注册的HttpMessageConverter将其转换为HTTP响应体。这个过程需要考虑以下几个关键因素:

  1. 客户端的Accept头: 客户端通过此头告诉服务器它期望接收的媒体类型。
  2. 服务器端支持的媒体类型: 服务器通过其配置(例如@RequestMapping注解的produces属性)声明它能够生成的媒体类型。
  3. 可用的HttpMessageConverter: Spring容器中注册的转换器,例如MappingJackson2HttpMessageConverter用于JSON,Jaxb2RootElementHttpMessageConverter用于XML等。

当上述任一环节不匹配时,例如客户端期望JSON,但服务器只声明能生产XML,或者虽然有JSON转换器但控制器方法没有明确声明produces JSON,Spring就可能抛出406错误。在提供的案例中,虽然添加了Jackson相关的依赖,但如果客户端期望JSON而Spring默认或尝试生成XML(可能是因为某种配置或依赖冲突导致XML转换器优先级更高),或者控制器方法没有明确指定produces = MediaType.APPLICATION_JSON_VALUE,那么问题依然会存在。

解决方案:明确指定媒体类型

解决406错误的核心在于明确告诉Spring控制器方法能够produces(生产)哪种媒体类型的响应,以及能够consumes(消费)哪种媒体类型的请求。这可以通过在@RequestMapping及其派生注解(如@GetMapping, @PostMapping)上使用produces和consumes属性来实现。

1. 解决GET请求的406错误(produces)

对于返回响应体的GET请求,我们需要使用produces属性来指定控制器方法能够生成的媒体类型。例如,如果期望返回JSON格式的响应,应将produces设置为MediaType.APPLICATION_JSON_VALUE。

示例代码:

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
@EnableWebMvc
@RequestMapping("/api")
@Log4j2
public class UsersController {

    @Autowired
    UsersService service;

    @ResponseBody
    @GetMapping(value = "/users", 
                produces = MediaType.APPLICATION_JSON_VALUE) // 明确指定生成JSON
    public ResponseEntity<UsersGetByIdResponseBody> findUById(@RequestParam Long userID) {
        // ... 业务逻辑 ...
        return service.getUsersInfoById(userID);
    }

    // ... 其他方法 ...
}

通过添加produces = MediaType.APPLICATION_JSON_VALUE,我们明确告诉Spring,findUById方法将生成JSON格式的响应。当客户端发送带有Accept: application/json头的请求时,Spring就能够找到MappingJackson2HttpMessageConverter来处理响应。

2. 解决POST请求的406/415错误(consumes & produces)

对于POST请求,通常涉及到接收请求体并返回响应体。因此,除了produces,我们还需要考虑consumes属性,它指定了控制器方法能够接受的请求体媒体类型。如果客户端发送的Content-Type头与consumes不匹配,可能会导致415 Unsupported Media Type 错误。

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载

示例代码:

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
@EnableWebMvc
@RequestMapping("/api")
@Log4j2
public class UsersController {

    @Autowired
    UsersService service;

    @PostMapping(value = "/users",
                 consumes = MediaType.APPLICATION_JSON_VALUE, // 明确指定消费JSON请求体
                 produces = MediaType.APPLICATION_JSON_VALUE)  // 明确指定生成JSON响应体
    public Users createU(@RequestBody UsersPostRequestBody ubody) {
        // ... 业务逻辑 ...
        return service.save(ubody);
    }

    // ... 其他方法 ...
}

在这里,consumes = MediaType.APPLICATION_JSON_VALUE确保控制器方法只接受JSON格式的请求体,而produces = MediaType.APPLICATION_JSON_VALUE则确保响应也是JSON格式。

依赖管理与注意事项

虽然明确指定produces和consumes是解决406错误的关键,但正确的依赖管理也是必不可少的。为了支持JSON处理,jackson-databind是核心依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version> <!-- 使用合适的版本 -->
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.annotations</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency>

而jackson-dataformat-xml只有在需要处理XML时才应添加。在尝试获取JSON响应时,如果添加了XML相关的Jackson依赖,可能会导致Spring默认尝试使用XML转换器,从而使问题变得复杂。因此,仅在需要时引入相关依赖,并始终通过produces和consumes明确声明意图,是最佳实践。

总结

HTTP 406 Not Acceptable 错误在Spring REST API中通常是内容协商失败的信号。解决此问题的关键在于:

  1. 理解HTTP内容协商机制,特别是客户端的Accept头与服务器端的Content-Type头。
  2. 在Spring控制器方法中明确使用produces属性来声明该方法能够生成哪些媒体类型的响应。
  3. 对于接收请求体的API,使用consumes属性来声明该方法能够接受哪些媒体类型的请求体。
  4. 确保项目中包含了必要的HttpMessageConverter依赖,例如用于JSON的jackson-databind。

通过遵循这些实践,开发者可以构建更加健壮和可预测的Spring RESTful API,有效避免内容协商相关的错误,确保API能够按照预期提供和消费数据。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

160

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

88

2026.01.26

PHP API接口开发与RESTful实践
PHP API接口开发与RESTful实践

本专题聚焦 PHP在API接口开发中的应用,系统讲解 RESTful 架构设计原则、路由处理、请求参数解析、JSON数据返回、身份验证(Token/JWT)、跨域处理以及接口调试与异常处理。通过实战案例(如用户管理系统、商品信息接口服务),帮助开发者掌握 PHP构建高效、可维护的RESTful API服务能力。

179

2025.11.26

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1948

2024.04.01

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号