首页 > 解决方案 > 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、缺少根元素以及元素名称的大小写不正确?

标签: xmljaxbmarshalling

解决方案


去雅加达工作。摆脱了所有的 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


推荐阅读