JAXB marshaller无法为跨越netbeans模块

时间:2016-02-03 09:04:02

标签: java xml netbeans jaxb netbeans-8.1

我有一个netbeans 8.1平台应用程序,它包含两个模块A和B.两者都包含使用JAXB编组/解组到XML的java类。

A包含一个抽象类,它本身包含一个接口:

@XmlAccessorType(value = XmlAccessType.FIELD)
abstract public class myAbstractClass {

    public interface myInterface {
        public void method();
    }

}

B包含此抽象类及其成员接口的扩展名:

import path.to.myAbstractClass;

@XmlAccessorType(value = XmlAccessType.FIELD)
@XmlRootElement(name = "mypackage-myextendedclass")
public class myExtendedClass extends myAbstractClass {

    public class mySubClass implements myInterface {

        @Override
        public void method()
        {
            // do some stuff
            return;
        }

    }

}

我正在尝试创建一个JAXBContext来编组B的实例,如下所示:

 JAXBContext context = JAXBContext.newInstance("A.AbstractClassPackage", B.myExtendedClass.getClassLoader());

A.AbstractClassPackage是模块A所在的包。

当我尝试如上所述创建JAXBContext时,我收到错误,说我正在尝试编组接口,而JAXB无法处理接口 - 就像这里:

Why does JAXB say "xxx is an interface, and JAXB can't handle interfaces". Even though the generated class is not an interface

我的错误实际上是指接口myInterface,所以我认为由于某种原因,JAXB试图为myAbstractClass而不是myExtendedClass创建一个上下文。我预感这是因为contextPath(JAXBContext.newInstance方法中的参数1)不正确。

我知道我可以为派生类创建一个JAXB接口,当它们驻留在同一个模块中时,我的问题是:

  1. 是否可以为派生类创建JAXB上下文,其中abstract / interface类位于派生类的不同netbeans模块中?

  2. 如果是这样,我如何将contextPath设置为指向两个模块?

1 个答案:

答案 0 :(得分:0)

解决方案结果很简单(ish),取自Radim的回答:JAXB in Netbeans Module

我只需要在模块B中添加模块依赖关系JAXB API(在原帖中描述)。这是运行时使用的netbeans JAXB类,而不是JDK版本。如果没有包含JAXB API,也会出现这样的错误(取自上面的链接):

javax.xml.bind.JAXBException: ClassCastException: attempting to cast jar:file:/C:/Program%20Files/jmonkeyplatform/ide/modules/ext/jaxb/api/jaxb-api.jar!/javax/xml/bind/JAXBContext.class to jar:file:/C:/Program%20Files/Java/jdk1.6.0_21/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class.  Please make sure that you are specifying the proper ClassLoader.

问题现在有意义(我认为)。通过不包括JAXB API,我只使用JAXB的非运行时JDK版本,我的派生类 - 其主机模块在运行时加载 - 被JAXB解释为基类,并且基类不完全兼容JAXB