问题描述
使用 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