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


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

    <?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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

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

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    生成XML schema看看:
    在这里插入图片描述
    生成的XML schema文件内容:

    <?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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    用Postman请求web服务,收到了正常的响应:
    在这里插入图片描述

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

  • 相关阅读:
    信息检索与数据挖掘 | (五)文档评分、词项权重计算及向量空间模型
    如何修炼成“神医”——《OceanBase诊断系列》之一
    (2023,域泛化 & 信息论 & 特征解缠)INSURE:信息论启发的域泛化解缠结和纯化模型
    PMP每日一练 | 考试不迷路-11.22(包含敏捷+多选)
    深度学习YOLO抽烟行为检测 - python opencv 计算机竞赛
    关于 CTF 中 php 考点与绕过那些事的总结
    【图像处理:OpenCV-Python基础操作】
    云备份——初步认识及环境搭建
    聚焦“硬核”技术,开放原子开源大赛苏州站圆满落幕
    Three.js机器人与星系动态场景:实现3D渲染与交互式控制
  • 原文地址:https://blog.csdn.net/panghuangang/article/details/134502545