Jaxb:Unmarshaller找不到带有命名空间和前缀的元素

时间:2014-01-25 14:46:42

标签: xml jaxb xml-namespaces unmarshalling moxy

我收到的xml看起来像是:

<result xmlns="firstUri">
    <blackList xmlns:ns1="secondUri">
        <ns2:BlackList xmlns:ns2="thirdUri">
            <name xmlns="thirdUri">some value</name>
            <nameFlag xmlns="thirdUri">some value</nameFlag>
        </ns2:BlackList>
        <ns2:BlackList xmlns:ns2="thirdUri">
            <name xmlns="thirdUri">some value</name>
            <nameFlag xmlns="thirdUri">some value</nameFlag>
        </ns2:BlackList>
             ..........................................................
    </blackList>
    <retCode xmlns:ns1="secondUri">0</retCode>
    <retDesc xmlns:ns1="secondUri">Succeeded</retDesc>
</result>

我想把它解构为对象。

我创建了以下bean:

@XmlRootElement(name = "result", namespace ="firstUri")
public class GetBlackListResp {
    protected String retCode;
    protected String retDesc;
    protected List<BlackListItem> blackListArray;

    @XmlRootElement(name = "BlackList", namespace = "thirdUri") 
    public static class BlackListItem{
        protected String name;
        protected String nameFlag;

        @XmlElement(name = "name", namespace = "thirdUri")
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }

        @XmlElement(name = "nameFlag", namespace = "thirdUri")
        public String getNameFlag() {
            return nameFlag;
        }
        public void setNameFlag(String nameFlag) {
            this.nameFlag = nameFlag;
        }
}    


    @XmlElement(name = "retCode", namespace = "firstUri")
    public String getRetCode() {
        return retCode;
    }

    public void setRetCode(String retCode) {
        this.retCode = retCode;
    }

    @XmlElement(name = "retDesc", namespace = "firstUri")
    public String getRetDesc() {
        return retDesc;
    }

    public void setRetDesc(String retDesc) {
        this.retDesc = retDesc;
    }

    @XmlElement(name = "blackList", namespace = "firstUri")
    public List<BlackListItem> getBlackList() {
        return blackListArray;
    }

    public void setBlackList(List<BlackListItem> blackListArray) {
        this.blackListArray = blackListArray;
    }
}

解组后,我得到了一个成功填充的对象,除了blackListArray字段。该字段包含列表,该列表只有一个项目。该项目中的所有字段均为空。

似乎JAXB可以找到元素,但是会遗漏其中的所有内部元素。

我使用MOXy作为JAXB实现。

P.S。

我尝试将package-info.java放在我的bean的文件夹中,如that question

中所述
@XmlSchema(
    elementFormDefault=XmlNsForm.QUALIFIED,
    namespace="thirdUri",
    xmlns={@XmlNs(prefix="ns2", 
                  namespaceURI="thirdUri")}
)
package package.with.my.bean;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

但它对我没有帮助。

1 个答案:

答案 0 :(得分:3)

你快到了。删除内部@XmlRootElement类上的BlackListItem注释,并将getBlackList方法上的注释更改为:

@XmlElementWrapper(name = "blackList", namespace = "firstUri")
@XmlElement(name = "BlackList", namespace = "thirdUri")
public List<BlackListItem> getBlackList() {
    return blackListArray;
}