我们可以在解组时在运行时决定jaxb类吗?

时间:2015-01-20 15:11:59

标签: java xml jaxb unmarshalling objectfactory

有没有办法在运行时决定将我的XML解组为哪个java类?

我用这种方式试过Unmarshall代码 -

public Object unmarshallXml(String xmlReq, String className)
{
    String myClass = className+".class";
    Object instances = null;
       try {
        JAXBContext jc = JAXBContext.newInstance( myClass );
           Unmarshaller u = jc.createUnmarshaller();
           StringBuffer xmlStr = new StringBuffer( xmlReq );
           StringReader strReader = new StringReader( xmlStr.toString() );
           StreamSource strSource = new StreamSource(strReader);
           Object o = u.unmarshal( strSource );

    } catch (JAXBException e) {

        e.printStackTrace();
    }
    return instances;
}

但得到了这个错误 -

" javax.xml.bind.JAXBException: "LookupInstances.class" doesnt contain ObjectFactory.class or jaxb.index"

3 个答案:

答案 0 :(得分:3)

  

我们可以在解组时在运行时决定jaxb类吗?

是的,您只需要使用unmarshal参数之一的Class方法。


构建JAXBContext

仅仅因为你想要解组课程Foo并不一定意味着你可以JAXBContext.createContext(Foo.class)。这是因为可能还有其他类需要无法通过该类传递(ObjectFactory)是一个很好的例子。

您可以在包名称上创建JAXBContext,但这需要以下之一:

  1. 一个名为ObjectFactory的注释为@XmlRegistry的类位于该包中,其中包含指向模型的足够指针以引入所有必需的类。如果您从XML Schema生成模型,那么将为您完成。
  2. 如果您没有上述ObjectFactory类,则可以包含一个名为jaxb.index的文本文件,其中包含一个回车分隔的模型短类名列表。
  3. 您的模型中没有其他包。如果JAXBContext需要从冒号分隔的上下文路径引导,其中包含的每个包满足上述两个条件之一。

答案 1 :(得分:2)

根据Unmarshaller的API,您可以致电u.unmarshal(strSource, Foo.class),这将返回JAXBElement<Foo>,您可以在其上调用getValue()以获取实际Foo }}

另外,请阅读JAXBContext的使用情况。你可能想把它传递给一个包而不是一个类 - 但你没有包含足够的上下文(哈哈)让我确定。

答案 2 :(得分:0)

另一个解决方案可以是 -

public Object unmarshallXml(String xmlReq, Object obj) {
    //ClientVariables instances = null;
    Object o = null;
    try {
        JAXBContext jc = JAXBContext.newInstance(obj.getClass());
        Unmarshaller u = jc.createUnmarshaller();
        StringBuffer xmlStr = new StringBuffer(xmlReq);
        StringReader strReader = new StringReader(xmlStr.toString());
        StreamSource strSource = new StreamSource(strReader);
        o = u.unmarshal(strSource);
        //instances = (ClientVariables) o;
    } catch (JAXBException e) {

        e.printStackTrace();
    }
    return o;
}

可以这样打电话 -

        Utility util = new Utility();
        LookupInstances instances = new LookupInstances();
        instances = (LookupInstances) util.unmarshallXml(xmlReq, instances);