2016-11-17 7 views
0

私はJAXBの新機能で、汎用オブジェクトをアンマーシャルしようとしています。問題は、オブジェクト(java.lang.Object)を整列化および非整列化できる必要があることです。マーシャリングは正常に行いましたが、アンマーシャリングを実行すると、自分自身のオブジェクトではなく、レスポンスに「ElementNSImpl」オブジェクトが追加されています。
Message.javaJAXBアンマーシャル汎用オブジェクト

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Message { 
    @XmlAnyElement(lax=true) 
    private Object obj; 
    //getter and setter 
} 


SomeBean.java

@XmlRootElement(name="somebean") 
public class SomeBean { 
    private String variable; 
    //getter and setter 
} 

そして、これは/アンマーシャリング

Message m = new Message(); 
SomeBean sb = new SomeBean(); 
sb.setVariable("lalallalala"); 
m.setObj(sb); 

JAXBContext jaxbContext = JAXBContext.newInstance("jaxb.entities"); 
Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
StringWriter sw = new StringWriter(); 
jaxbMarshaller.marshal(m, sw); 
System.out.println(sw.toString()); //this shows me the xml correctly 

//unmarshal code 
JAXBContext jc = JAXBContext.newInstance(Message.class); 
StringReader reader = new StringReader(sw.toString()); 
Unmarshaller unmarshaller = jc.createUnmarshaller(); 
Object result = unmarshaller.unmarshal(reader); 
Message msg = (Message)result; 
をマーシャリングするためのコードです:
これは関与豆です

jaxb.in​​dex
内容:

Message 
SomeBean 

生成されるXMLは、(<?xml version="1.0" encoding="UTF-8" standalone="yes"?><message><somebean><variable>lalallalala</variable></somebean></message>)大丈夫ですが、私は評価するとき "msg.getObjは()" 非整列化した後、私はSomeBeanインスタンスが、ElementNSImplを得ることはありません。
私の質問は、私がマーシャリングしたSomeBeanオブジェクトをどうやって元に戻すことができるかということです。
ありがとうございます。

答えて

0

が最後にこの答えでそれを解決:https://stackoverflow.com/a/9081855/1060779、私は二回非整列化を適用:

Unmarshaller unmarshaller = jc.createUnmarshaller(); 
    Object result = unmarshaller.unmarshal(reader); 
    Message msg = (Message)result; 
    if (msg.getObj() instanceof Node) { 
     ElementNSImpl e = (ElementNSImpl)msg.getObj(); 
     Class<?> clazz = Class.forName(packageName.concat(".").concat(e.getNodeName())); 
     jc = JAXBContext.newInstance(clazz); 
     unmarshaller = jc.createUnmarshaller(); 
     SomeBean sBean = (SomeBean)unmarshaller.unmarshal((ElementNSImpl)msg.getObj()); 
     System.out.println(sBean.toString()); 
    } 
関連する問題