質問

I receive xml that look like:

<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>

And I want to unmarshal it to object.

I created following 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;
    }
}

After unmarshalling I got object, which is successful filled, except blackListArray field. That field contain list, which have only one item. And all fields in that item are nulls.

It seems like JAXB can find element, but miss all inner elements inside it.

I use MOXy as JAXB implementation.

P.S.

I tried put package-info.java in folder with my bean as say in 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;

But it did not help for me.

役に立ちましたか?

解決

You're almost there. Remove the @XmlRootElement annotation on the inner BlackListItem class, and change the annotations on the getBlackListmethod to:

@XmlElementWrapper(name = "blackList", namespace = "firstUri")
@XmlElement(name = "BlackList", namespace = "thirdUri")
public List<BlackListItem> getBlackList() {
    return blackListArray;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top