使用 JAXB 的问题,我的 POJO 字段没有被映射

问题描述

我正在使用 Java 8 Springboot 和 Maven。

当我尝试解组 XML 并使用给定参数映射 FTMessage 对象时,对象被创建,但对象的所有字段都被映射 为空。 在 try-catch 中包装解组器时,JAXB 会运行并且不会抛出任何错误

所以结果是:

userShortName = nullfilename = 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")