如果@XmlElement没有名称空间,则为null

时间:2017-01-10 16:52:21

标签: java jaxb

我使用Jaxb unmarshaller将xmpp服务器的部分响应映射到java对象。

Test.java

public class Test {
    public static void main(String[] args) throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(MucUser.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        ByteArrayInputStream bais = new ByteArrayInputStream((
            "<x xmlns='http://jabber.org/prot" +
            "ocol/muc#user'><item role='moderator'" +
            " affiliation='owner'/></x>").getBytes());
        MucUser mucUser = (MucUser) unmarshaller.unmarshal(bais);
        System.out.println(mucUser.getItem());
    }
}

MucUser.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(namespace = "http://jabber.org/protocol/muc#user", name = "x")
public class MucUser {
    @XmlElement(name = "item")
    private Item item;

    // getter and setter without annotations
}

Item.java

@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
    @XmlAttribute(name = "role")
    private String role;
    @XmlAttribute(name = "affiliation")
    private String affiliation;

    // getters and setters without annotations
}

我不使用ObjectFactory.java和package-info.java。字段item未被取消编组,mucUser.getItem()返回null。但是当我明确地将名称空间tst添加到Test.java中的元素<item>并修改MucUser.java以使用注释@XmlElement(name = "item", namespace="tst")时,它可以正常工作!

但是,我不能按照我的意愿修改该字符串,它是协议的一部分。

如何在MucUser类中正确映射item

1 个答案:

答案 0 :(得分:0)

在XML中,您要在'x'元素中设置默认命名空间。包含的元素使用此命名空间。因此,Item应使用与Mcuser相同的命名空间