首页 > 解决方案 > 使用 JAXB 的问题,我的 POJO 字段没有被映射

问题描述

我正在使用带有 Maven 的 Java 8 Springboot。

当我尝试解组 XML 并使用给定参数映射 FTMessage 对象时,会创建该对象,但该对象的所有字段都映射为 null。将 unmarshaller 包装在 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>

标签: javaxmlspring-bootmavenjaxb

解决方案


我发现的解决方法是将命名空间属性添加到不仅是,@XmlRootElement而且是所有的@XmlElement,就像这样:

@XmlElement(name = "UserShortName", namespace = "https://www.example.com/exmpl")

推荐阅读