JAXB 在错误的情况下编组了 xml 输出并缺少一些元素

问题描述

使用 JAXB 3.0、Java 1.11、Eclipse 2019-12。 xml对象中的值是用setter方法设置的,输出xml时是这样的

<?xml version="1.0" encoding="UTF-8"?>
 <USERID>xxxxxxxxxxxx</USERID>
 <clientIp>122.3.3</clientIp>
 <revision>1</revision>
 <sourceId>xxxxxxxxxx</sourceId>

代替

<?xml version="1.0" encoding="UTF-8"?>
<TrackFieldRequest USERID="xxxxxxxxxxx">
<Revision>1</Revision>
<ClientIp>122.3.3</ClientIp>
<SourceId>xxxxxxxxxx</SourceId>
<TrackID ID="xxxxxxxxxxxxxxxxxxxxxx"/>
<TrackID ID="xxxxxxxxxxxxxxxxxxxxxx"/>
</TrackFieldRequest>

这是元帅代码的片段

TrackFieldRequest request = tracker.buildrequest();
                
        try {
        
           javax.xml.bind.JAXBContext    jaxbContext = javax.xml.bind.JAXBContext.newInstance(TrackFieldRequest.class);
           
           //Create Marshaller
           Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

           //required formatting??
           jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);

           //Print XML String to Console
           StringWriter sw = new StringWriter();
            
           //Write XML to StringWriter
           jaxbMarshaller.marshal(request,sw);
            
           //Verify XML Content
           String xmlContent = sw.toString();
           System.out.println( xmlContent );

这里是带注释的 jaxb 类 TrackFieldRequest 的一部分

@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "TrackFieldRequest",propOrder = {
    "Revision","ClientIp","SourceId","TrackID"
})
@XmlRootElement(name = "TrackFieldRequest")
public class TrackFieldRequest {

    @XmlElement(name = "Revision",required = true)
    protected BigInteger Revision;
    @XmlElement(name = "ClientIp",required = true)
    protected String ClientIp;
    @XmlElement(name = "SourceId",required = true)
    protected String SourceId;
    @XmlElement(name = "TrackID",required = true)
    protected List<TrackFieldRequest.TrackID> TrackID;
    @XmlAttribute(name = "USERID")
    protected String userid;
:
:
    public static class TrackID {

        @XmlAttribute(name = "ID")
        protected String id;

仔细检查了两个跟踪 ID 的内容,它们都存在 System.out.println(request.getTrackID().get(0).getID()); System.out.println(request.getTrackID().get(1).getID());

为什么会丢失多次出现的轨道 ID、缺少根元素以及元素名称的大小写不正确?

解决方法

去雅加达工作了。摆脱了所有的 jaxb jar 并保留了 jakarta jar jakarta.xml.bind-api-3.0.0 并重新编写了导入语句

导入 jakarta.xml.bind.*;

并更新了 jaxb.properties

jakarta.xml.bind.JAXBContextFactory=org.eclipse.persistence.jaxb.JAXBContextFactory