【问题标题】:JAXB Unmarshal generic objectJAXB 解组通用对象
【发布时间】:2016-11-17 15:44:04
【问题描述】:

我对 JAXB 很陌生,尝试解组通用对象时遇到了麻烦。问题是我需要能够编组和解组任何对象(java.lang.Object)。我成功地进行了编组,但是当我运行解组时,我在响应中得到了一个“ElementNSImpl”对象,而不是我自己的对象。
这是涉及的 bean:
Message.java

@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 对象?
提前致谢。

【问题讨论】:

    标签: java jaxb unmarshalling


    【解决方案1】:

    最后用这个答案解决了它: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());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多