问题描述
我正在使用 Java 8 Springboot 和 Maven。
当我尝试解组 XML 并使用给定参数映射 FTMessage 对象时,对象被创建,但对象的所有字段都被映射 为空。 在 try-catch 中包装解组器时,JAXB 会运行并且不会抛出任何错误。
所以结果是:
userShortName = null
和 filename = null
这是我的代码:
JAXBContext jaxbContext = JAXBContext.newInstance( FTMessage.class );
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(xmlMessage); //xmlMessage is a string.
FTMessage msg = ((FTMessage) unmarshaller.unmarshal(reader)); //msg ends up with fields populated with null.
还有我的项目等级:
package com.project.message;
import javax.xml.bind.annotation.XmlAccesstype;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlRootElement(name = "FTMessage",namespace = "https://www.example.com/exmpl" )
public class FTMessage /*implements Serializable*/ {
@XmlElement(name = "UserShortName")
private String userShortName;
@XmlElement(name = "Filename")
private String filename;
public FTMessage () {
}
public FTMessage (String userShortName,String filename) {
this.userShortName= userShortName;
this.fundShortName = filename;
}
@Override
public String toString() {
return "FTMessage {userShortName: " + this.userShortName+ "," +
"filename : " + this.filename + "}";
}
public String getUserShortName() {
return userShortName;
}
public void setUserShortName(String userShortName) {
this.userShortName = userShortName;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
}
以及我的 XML 字符串:
<?xml version="1.0" encoding="UTF-8"?>
<FTMessage xmlns="https://www.example.com/exmpl"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<UserShortName>Jerome</UserShortName>
<Filename>NotReal.csv</Filename>
</FTMessage>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:FTMessage xmlns:ns2="https://www.example.com/exmpl">
<UserShortName>Jerome</UserShortName>
<Filename>notReal</Filename>
</ns2:FTMessage>
解决方法
我发现的解决方法是将命名空间属性添加到 @XmlRootElement
中,而且还添加到所有 @XmlElement
中,如下所示:
@XmlElement(name = "UserShortName",namespace = "https://www.example.com/exmpl")