我有一个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无法处理接口 - 就像这里:
我的错误实际上是指接口myInterface,所以我认为由于某种原因,JAXB试图为myAbstractClass而不是myExtendedClass创建一个上下文。我预感这是因为contextPath(JAXBContext.newInstance
方法中的参数1)不正确。
我知道我可以为派生类创建一个JAXB接口,当它们驻留在同一个模块中时,我的问题是:
是否可以为派生类创建JAXB上下文,其中abstract / interface类位于派生类的不同netbeans模块中?
如果是这样,我如何将contextPath设置为指向两个模块?
答案 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