Spring MVC 通过内容协商机制自动返回多格式数据,依赖配置application.properties、引入对应消息转换器依赖(如Jackson XML/YAML)、Controller保持简洁,必要时可自定义ContentNegotiationManager。

Spring MVC 实现多格式数据返回,核心靠内容协商(Content Negotiation)机制自动匹配客户端期望的格式,不需要在 Controller 中手动判断或转换。关键在于让框架“知道”它能提供哪些格式,并“读懂”客户端想要哪一种。
启用并配置内容协商策略
Spring Boot 默认已启用内容协商,但行为细节需明确配置。主要控制点在 application.properties 或 application.yml 中:
-
开启路径扩展名支持:允许通过
/api/users.json或/api/users.xml直接指定格式spring.mvc.contentnegotiation.favor-path-extension=true -
开启参数方式支持:允许用
?format=json或?format=xmlspring.mvc.contentnegotiation.favor-parameter=true
(注意:默认参数名是format,可自定义,如spring.mvc.contentnegotiation.parameter-name=output) -
是否忽略 Accept 请求头:设为
false(默认),确保尊重客户端发来的Accept: application/xml等头信息 -
设置默认媒体类型:当所有协商方式都失败时返回的格式
spring.mvc.contentnegotiation.default-content-type=application/json
引入对应的消息转换器依赖
仅配置协商策略还不够——Spring 必须有能把 Java 对象转成 XML/JSON/YAML 的“工具”。这些工具由 HttpMessageConverter 实现,它们随依赖自动注册:
-
JSON 支持:引入
spring-boot-starter-web即自带Jackson2ObjectMapperBuilder和MappingJackson2HttpMessageConverter -
XML 支持:必须额外添加 Jackson XML 依赖:
<dependency><br> <groupId>com.fasterxml.jackson.dataformat</groupId><br> <artifactId>jackson-dataformat-xml</artifactId><br></dependency>
-
YAML 支持:加
jackson-dataformat-yaml依赖,并确保spring-boot-starter-web版本 ≥ 2.6.x;还需配置spring.http.converters.preferred-json-mapper=jackson避免冲突
Controller 保持简洁,无需改动
只要方法标注 @ResponseBody(或类上用 @RestController),返回普通 POJO 或集合即可。Spring 自动选择合适的 HttpMessageConverter:
@GetMapping("/users")
public List<User> listUsers() {
return userService.findAll();
}
调用示例:
-
GET /users.json→ 返回 JSON -
GET /users.xml→ 返回 XML(前提是 XML 依赖已就位) -
GET /users?format=xml→ 同样返回 XML -
GET /users+Accept: application/xml→ 也返回 XML
必要时自定义协商逻辑
若默认规则不满足业务(比如移动端强制走 JSON、管理后台优先 XML),可通过 Java Config 定制 ContentNegotiationManager:
- 禁用某类协商方式(如彻底关闭路径扩展,只认 Accept 头)
- 调整媒体类型权重顺序(例如把
application/vnd.api+json排在标准 JSON 前) - 注册自定义
ContentNegotiationStrategy,从请求中提取租户 ID 决定格式
这类定制通常写在实现 WebMvcConfigurer 的配置类里,重写 configureContentNegotiation 方法。


















