Spring MVC 内容协商自动适配多格式响应,依赖配置齐全(如Jackson内置JSON、显式添加jackson-dataformat-xml支持XML)、按URL扩展名/请求参数/Accept头/默认类型优先级匹配媒体类型,Controller只需返回POJO且不硬编码produces。

Spring MVC 通过 ContentNegotiation(内容协商)自动适配 JSON、XML 等响应格式,核心不是写 if-else 判断,而是让框架根据客户端诉求选对转换器。只要配置到位、依赖齐全、控制器保持简洁,就能一条路径返回多种格式。
依赖和基础配置要齐备
没有对应的消息转换器,协商就无从谈起:
- JSON 支持:spring-boot-starter-web 已内置 Jackson,无需额外操作
- XML 支持:必须显式添加 jackson-dataformat-xml 依赖(JAXB 在 JDK 11+ 已移除,不推荐)
- YAML 支持:加 jackson-dataformat-yaml,并确保 Spring Boot ≥ 2.6.x;还需设 spring.http.converters.preferred-json-mapper=jackson
- 传统 Spring MVC(非 Boot)需手动注册 MappingJackson2HttpMessageConverter 和 MappingJackson2XmlHttpMessageConverter,并装配 ContentNegotiationManager
协商方式按优先级生效
Spring 默认按以下顺序尝试确定媒体类型,任一匹配成功即停止:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- URL 扩展名:如 /user/1.json → application/json(默认启用,但生产建议关闭)
- 请求参数:如 /user/1?format=xml(需开启 spring.mvc.contentnegotiation.favor-parameter=true)
- Accept 请求头:最标准的方式,如 Accept: application/xml, application/json;q=0.9
- 默认类型:以上都失败时,用 spring.mvc.contentnegotiation.default-content-type=application/json
Controller 写法要“不动声色”
不需要注解指定格式,也不需要多套方法:
立即学习“Java免费学习笔记(深入)”;
- 用 @RestController 或方法上加 @ResponseBody
- 返回普通 POJO(字段有 getter)、List 或 Map 即可
- 确保 POJO 是 public 类,属性可被 Jackson/XML 转换器访问(避免 private 字段无 getter)
- 不要在 @RequestMapping 上硬编码 produces = "application/json",否则会绕过协商机制
常见问题与调整点
协商失效往往不是逻辑错,而是细节卡住:
- 检查 Accept 头是否被忽略:确认 ignoreAcceptHeader=false(Spring Boot 默认就是 false)
- XML 返回空或 406:验证 User 类是否加了 @JacksonXmlRootElement(用 Jackson XML 时)或确保字段有 public getter
- 想支持自定义格式(如 .csv):实现自定义 HttpMessageConverter 并注册到容器
- 调整格式优先级:在 Java 配置中调用 configurer.defaultContentType(...) 或修改 Accept 权重

















