使用 Spring WebMVC 控制器生成 XML 响应

在本文中,我们将探讨Spring WebMVC – 使用控制器生成 XML 响应的机制和方面。还指导 Java 开发人员完成配置 Spring WebMVC 控制器以生成 XML 响应的步骤。
配置 Spring MVC 控制器以生成 XML 响应的主要方法有以下三种:

  • JAXB 编组
  • 手动 XML 构建
  • Jackson XML 数据格式

JAXB 编组
JAXB(Java Architecture for XML Binding)是一个标准 Java 库,用于处理 XML 和 Java 对象之间的转换。使用 JAXB,控制器方法返回 POJO,Spring 使用 JAXB 将其转换为 XML。这是最常见的方法。

手动 XML 构建
对于使用最少 XML 的简单情况,开发人员可以在控制器方法中手动构建 XML 字符串或文档。虽然允许完全自定义,但这会绕过对象映射并需要容易出错且不易维护的字符串操作。

Jackson 库提供了一种 XML 数据格式,可以用作 JAXB 的替代方案。它支持将 Java 对象绑定到 XML,与 JAXB 类似,但具有附加功能。控制器返回一个 POJO,Jackson 对其进行转换。

如何使用 Spring WebMVC 控制器生成 XML 响应

  • 在 pom.xml 文件中添加所需的依赖项。
  • 创建一个 Java 类来表示要返回的 XML 结构。这将是您的 XML 模型。
  • 使用 @XmlRootElement 和 @XmlAccessorType(XmlAccessType.FIELD) 注解模型类
  • 在控制器中自动装配 XmlMapper:
  • 在控制器方法中,创建 XML 模型的实例、填充它并返回它。
  • Spring 将使用 XmlMapper 自动将模型转换为 XML,并以内容类型“application/xml”返回。

@XmlRootElement 和 @XmlAccessorType 注释用于使用 JAXB(Java XML 绑定体系结构)进行 XML 序列化和反序列化。


项目依赖:

  • Spring web
  • Thymeleaf
  • Jackson-Data-Format

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns=
"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>3.2.0</version> 
        <relativePath/> <!-- lookup parent from repository -->
    </parent> 
    <groupId>com.spring</groupId> 
    <artifactId>Jackson_Format</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>Jackson_Format</name> 
    <description>Demo project for Jackson_Format</description> 
    <properties> 
        <java.version>17</java.version> 
    </properties> 
    <dependencies> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-thymeleaf</artifactId> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-web</artifactId> 
        </dependency> 
  
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-test</artifactId> 
            <scope>test</scope> 
        </dependency> 
        <dependency> 
    <groupId>com.fasterxml.jackson.dataformat</groupId> 
    <artifactId>jackson-dataformat-xml</artifactId> 
</dependency> 
  
    </dependencies> 
  
    <build> 
        <plugins> 
            <plugin> 
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-maven-plugin</artifactId> 
            </plugin> 
        </plugins> 
    </build> 
  
</project>

Student.java

package com.demo.model; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; 
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; 
@JacksonXmlRootElement(localName = "student"

public class Student { 
    @JacksonXmlProperty private String name; 

    @JacksonXmlProperty private int age; 

    private String course; 

    private boolean feesPaid; 

    public Student() 
    { 
        super(); 
        
// TODO Auto-generated constructor stub 
    } 

    public Student(String name,int age,String course,boolean feesPaid) 
    { 
        super(); 
        this.name = name; 
        this.age = age; 
        this.course = course; 
        this.feesPaid = feesPaid; 
    } 

    public String getName() { 
    return name; 
    } 

    public void setName(String name) { 
    this.name = name; 
    } 

    public int getAge() { 
    return age; 
    } 

    public void setAge(int age) { 
    this.age = age; 
    } 

    public String getCourse() { 
    return course; 
    } 

    public void setCourse(String course) 
    { 
        this.course = course; 
    } 

    public boolean isFeesPaid() { 
    return feesPaid; 
    } 

    public void setFeesPaid(boolean feesPaid) 
    { 
        this.feesPaid = feesPaid; 
    } 
}

StudentController.java

package com.demo.controller; 
import com.demo.model.Student; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 
@Controller
@RequestMapping("/api"
public class StudentController { 

    @GetMapping(value =
"/student"
                produces =
"application/xml"
    @ResponseBody
    public Student 
    getStudent() 
    { 
        Student student = new Student(); 
        student.setName(
"ABC"); 
        student.setAge(21); 
        student.setCourse(
"Java-DSA"); 
        student.setFeesPaid(false); 
        return student; 
    } 
}

启动应用程序
现在,你可以通过 IDE 或使用 Spring Boot 提供的命令行工具运行 Spring Boot 应用程序。

mvn spring-boot:run