Spring MVC怎么返回XML数据 @RestController注解

11次阅读

spring mvc 中 @RestController 返回 xml 需添加 jackson-dataformat-xml 依赖,用 @JacksonXmlRootElement 和 @JacksonXmlProperty 标注实体类,并在控制器方法中指定 produces = MediaType.appLICATION_XML_VALUE。

Spring MVC怎么返回XML数据 @RestController注解

spring mvc 中使用 @RestController 返回 XML 数据,核心在于让 Spring 能正确序列化对象为 XML,并设置响应的 Content-Type 为 application/xml。默认情况下,@RestController 依赖 Jackson(处理 jsON),要支持 XML 需额外配置和依赖。

添加 Jackson XML 序列化支持依赖

mavenpom.xml 中引入 jackson-dataformat-xml

     com.fasterxml.jackson.dataformat     jackson-dataformat-xml 

该依赖会自动注册 XmlMapperspring boot 2.2+ 会自动识别并启用 XML 消息转换器(Jackson2ObjectMapperBuilder + MappingJackson2XmlhttpMessageConverter)。

确保实体类支持 XML 序列化

用 Jackson 的注解标注 POJO,例如:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;  @JacksonXmlRootElement(localName = "user") public class User {     @JacksonXmlProperty(localName = "id")     private Long id;          @JacksonXmlProperty(localName = "name")     private String name;          // getter/setter 省略 }

  • @JacksonXmlRootElement:指定根元素名
  • @JacksonXmlProperty:控制字段对应 XML 元素名及是否作为属性(加 isAttribute = true
  • 字段需有 public getter,或开启 setVisibility 配置才能访问私有字段

控制器方法声明 Accept 和 Produces

显式指定支持 XML 响应,推荐写法:

@GetMapping(value = "/user/{id}", produces = MediaType.APPLICATION_XML_VALUE) public User getUser(@PathVariable Long id) {     return new User(id, "Alice"); }

  • produces = MediaType.APPLICATION_XML_VALUE 告诉 Spring 此接口只返回 XML
  • 客户端请求头带 Accept: application/xml 时才会匹配(若同时支持 json 和 XML,可写 produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}
  • 不写 produces 时,Spring 会根据请求头 Accept 自动协商,但需确保客户端明确指定

验证与调试小技巧

如果返回仍是 JSON 或报 406 Not Acceptable 错误,检查以下几点:

  • 确认依赖已生效(ide 中查看是否引入了 jackson-dataformat-xml 及其 transitive 依赖如 woodstox-core
  • 启动日志中搜索 XmlHttpMessageConverter,看是否被注册
  • curl 测试时带上头:curl -H "Accept: application/xml" http://localhost:8080/user/1
  • 浏览器直接访问通常发 text/html,不会触发 XML,建议用 postmancurl

text=ZqhQzanResources