Spring MVC 动态支持 JSON/XML 的技巧

引言

在实际开发中,我们经常需要让接口同时支持多种数据格式(如 JSON、XML),以满足不同客户端的请求需求。例如:

  • 前端页面默认使用 JSON 格式;

  • 第三方系统要求返回 XML 格式。

一、Spring MVC 内容协商原理

Spring MVC 的 ContentNegotiation 机制可以根据请求参数或 Accept 头自动选择响应格式。其核心逻辑如下:

  1. 客户端发起请求时,通过 URL 参数 或 Accept 头 声明期望的数据格式。

  2. 服务端根据配置的 MediaType 匹配对应的消息转换器(如 Jackson2HttpMessageConverter)。

  3. 最终返回对应格式的数据。


二、配置内容协商策略

以下是关键配置代码:

复制代码
package com.kjwl.framework.config;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorParameter(true)
                // 客户端请求url需要携带一个query参数 默认名称是 format
                .parameterName("format")
                .ignoreAcceptHeader(true) // 忽略Accept头,强制使用默认类型
                // 如果不声明 该query参数 返回的是json  如果你想指定默认返回类型就需要声明
                .defaultContentType(MediaType.APPLICATION_JSON)
                .mediaType("json", MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML);

    }
}

三、配置解析
  1. favorParameter(true)

    允许通过 URL 参数(如 ?format=xml)指定返回格式。默认参数名为 format,可通过 parameterName() 自定义。

  2. ignoreAcceptHeader(true)

    是否忽略客户端的 Accept 头。若设置为 true,则强制使用 URL 参数或默认格式;若为 false,则优先使用 Accept 头。

  3. defaultContentType()

    未指定格式时,默认返回 JSON。

  4. mediaType()

    注册支持的格式映射。例如,format=xml 对应 APPLICATION_XML。


四、实现 XML 支持

仅仅配置内容协商还不够! 需添加 XML 消息转换器依赖:

复制代码
<!-- Maven 依赖:Jackson XML 处理 -->
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

Spring Boot 会自动检测该依赖,并注册 MappingJackson2XmlHttpMessageConverter。


五、接口使用示例
复制代码
@RestController
public class UserController {
    
    @GetMapping("/user")
    public User getUser() {
        return new User("tom", "tom@example.com");
    }
}

测试请求:

  1. 默认返回 JSON

    GET /user

    响应:{"name": "tom", "email": "tom@example.com"}

  2. 通过参数返回 XML

    GET /user?format=xml

    响应:

    tom

    tom@example.com

相关推荐
Wx-bishekaifayuan25 分钟前
Springcloud中学在线学习平台58883-计算机课程设计、毕业设计
java·vue.js·spring boot·学习·spring·spring cloud·课程设计
现任明教教主~12 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
卓怡学长16 小时前
w204基于springbo旅行社签证代理服务系统
java·spring boot·spring·intellij-idea
牧瀬クリスだ16 小时前
Spring统一功能处理
java·spring boot·spring·状态模式
nhdh17 小时前
SpringAI与SpringAIAlibaba:标准与生态的完美互补
java·人工智能·spring
温暖小土18 小时前
Spring AI 接入通义千问向量模型
java·人工智能·spring
余槐i18 小时前
rollbackFor 不设置,Checked 异常不回滚:Spring 默认规则与两行修复的取舍
java·spring boot·后端·spring·事务管理
❀͜͡傀儡师19 小时前
Spring AI 集成 TypeSafe:用判断模型处理工单分流与链路决策
java·人工智能·spring
子一!!19 小时前
集成Spring家族的Spring论坛实战==一阶段
java·后端·spring
谢亮_vipxieliang20 小时前
ValidX 在微服务架构中的验证策略
java·spring boot·spring·spring cloud·hibernate