JAXB:用XmlElement注解复杂类型的Java属性,来产生多层嵌套的xml元素

例如,下面这段请求的xml代码,在元素body下面又多了一层,嵌套了4个元素:

csharp 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<request>
    <reqtype>04</reqtype>
    <secret>test</secret>
    <body>
        <userid>15</userid>
        <seeid>1001</seeid>
        <upseeid>10</upseeid>
        <status>1</status>
    </body>
</request>

可以使用下面的JAXB注解来跟上面的xml映射。其中属性seeContent映射到xml的body元素,seeContent属性的类型不再是一个简单类型,而是一个Java类:

csharp 复制代码
package com.thb.server.topology;

import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

/**
 * 该类映射到http请求的xml
 * @author thb
 *
 */
// 使用了JAXB注解,映射到xml中的request元素
@XmlRootElement(name = "request")
public class TopologyRequest {

    private String reqtype;
    private String secret;
    private SeeContent seeContent;

    // 使用了JAXB注解,映射到xml中的reqtype元素
    @XmlElement(name="reqtype", required = true)
    public String getReqtype() {
        return this.reqtype;
    }

    // 此处的setter函数要有,否则从xml反序列到java对象的时候无法赋值
    public void setReqtype(String reqtype) {
        this.reqtype = reqtype;
    }

    // 使用了JAXB注解,映射到xml中的secret元素
    @XmlElement(name="secret", required = true)
    public String getSecret() {
        return this.secret;
    }

    // 此处的setter函数要有,否则从xml反序列到java对象的时候无法赋值
    public void setSecret(String secret) {
        this.secret = secret;
    }

    // 使用了JAXB注解,映射到xml中的body元素
    @XmlElement(name="body", required = true)
    public SeeContent getSeeContent() {
        return this.seeContent;
    }

    public void setSeeContent(SeeContent seeContent) {
        this.seeContent = seeContent;
    }
}

下面定义Java属性seeContent引用的类型SeeContent,这个类的属性映射到xml中body元素下面的四个元素:

csharp 复制代码
package com.thb.server.topology;

import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlType;

@XmlType(propOrder = {"userid", "seeid", "upseeid", "status"})
class SeeContent{

    private String userid;
    private String seeid;
    private String upseeid;
    private String status;

    // 使用了JAXB注解,映射到xml中body元素下面的userid元素
    @XmlElement(name="userid", required = true)
    String getUserid() {
        return this.userid;
    }

    void setUserid(String userid) {
        this.userid = userid;
    }

    // 使用了JAXB注解,映射到xml中body元素下面的seeid元素
    @XmlElement(name="seeid", required = true)
    String getSeeid() {
        return this.seeid;
    }

    void setSeeid(String seeid) {
        this.seeid = seeid;
    }

    // 使用了JAXB注解,映射到xml中body元素下面的upseeid元素
    @XmlElement(name="upseeid", required = true)
    String getUpseeid() {
        return this.upseeid;
    }

    void setUpseeid(String upseeid) {
        this.upseeid = upseeid;
    }

    // 使用了JAXB注解,映射到xml中body元素下面的status元素
    @XmlElement(name="status", required = true)
    String getStatus() {
        return this.status;
    }

    void setStatus(String status) {
        this.status = status;
    }
}

生成XML schema看看:

生成的XML schema文件内容:

csharp 复制代码
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="request" type="topologyRequest"/>

  <xs:complexType name="topologyRequest">
    <xs:sequence>
      <xs:element name="reqtype" type="xs:string"/>
      <xs:element name="secret" type="xs:string"/>
      <xs:element name="body" type="seeContent"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="seeContent">
    <xs:sequence>
      <xs:element name="userid" type="xs:string"/>
      <xs:element name="seeid" type="xs:string"/>
      <xs:element name="upseeid" type="xs:string"/>
      <xs:element name="status" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

用Postman请求web服务,收到了正常的响应:

在服务端把收到的信息打印出来,成功将请求的xml内容反序列化到了java对象,内容正确:

相关推荐
麦兜*1 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
Hellyc6 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge6 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂7 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
有没有没有重复的名字8 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
程序员的世界你不懂10 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(4)集成Allure报表
java·selenium·maven
isNotNullX10 小时前
数据中台架构解析:湖仓一体的实战设计
java·大数据·数据库·架构·spark