2017-01-10 10 views
0

私はJaxbアンマーシャラーを使用して、xmppサーバーからJavaオブジェクトへの応答の一部をマッピングしています。私はObjectFactory.javaとpackage-info.javaを使用していない@XmlElementに名前空間がないときはnullです

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 
} 

。フィールドitemはアンマーシャリングされておらず、mucUser.getItem()はnullを返します。しかし、明示的に名前空間tstをTest.javaの要素<item>に追加し、MuchUser.javaを注釈@XmlElement(name = "item", namespace="tst")を使用するように変更すると、正常に動作します。

しかし、私は自分の意志でその文字列を変更することはできません。これはプロトコルの一部です。

itemをMucUserクラスに正しくマップするにはどうすればよいですか?

答えて

0

XMLでは、デフォルトの名前空間を 'x'要素に設定しています。包含された要素はこの名前空間を使用します。したがって、項目はMcuserと同じ名前空間を使用する必要があります

+0

ありがとうございます。 @MmlElement(name = "item"、namespace = "http://jabber.org/protocol/muc#user") '' 'に' 'MucUser.java'''のアノテーションを変更して起動しました期待通りに働く – Alexey

関連する問題