JAXB 编组器无法为跨 netbeans 模块实现的 class 创建上下文
JAXB marshaller cannot create context for class implemented across netbeans modules
我有一个包含两个模块 A 和 B 的 netbeans 8.1 平台应用程序。两者都包含 java class 正在 marshalled/unmarshalled to/from XML 使用 JAXB。
A 包含一个抽象 class,它本身包含一个接口:
@XmlAccessorType(value = XmlAccessType.FIELD)
abstract public class myAbstractClass {
public interface myInterface {
public void method();
}
}
B 包含此抽象的扩展 class 及其成员接口:
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)不正确。
我知道我可以为派生的 classes 创建一个 JAXB 接口,当它们驻留在同一个模块中时,所以我的问题是:
是否可以为派生的 classes 创建 JAXB 上下文,其中 abstract/interface class 驻留在与派生的 [=50] 不同的 netbeans 模块中=]?
如果是这样,我如何设置 contextPath 以指向两个模块?
结果证明解决方案很简单(大概),取自 Radim 的回答:JAXB in Netbeans Module
我只需要在模块 B 中添加对 JAXB API 的模块依赖(在原文 post 中有描述)。这是在运行时使用的 netbeans JAXB class,而不是 JDK 版本。如果不包含 JAXB API,也会出现如下错误(取自上述 link):
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 版本,而我派生的 class - 其主机模块在运行时加载 - 被解释为基础 class 由 JAXB 开发,基础 class 不完全兼容 JAXB。
我有一个包含两个模块 A 和 B 的 netbeans 8.1 平台应用程序。两者都包含 java class 正在 marshalled/unmarshalled to/from XML 使用 JAXB。
A 包含一个抽象 class,它本身包含一个接口:
@XmlAccessorType(value = XmlAccessType.FIELD)
abstract public class myAbstractClass {
public interface myInterface {
public void method();
}
}
B 包含此抽象的扩展 class 及其成员接口:
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)不正确。
我知道我可以为派生的 classes 创建一个 JAXB 接口,当它们驻留在同一个模块中时,所以我的问题是:
是否可以为派生的 classes 创建 JAXB 上下文,其中 abstract/interface class 驻留在与派生的 [=50] 不同的 netbeans 模块中=]?
如果是这样,我如何设置 contextPath 以指向两个模块?
结果证明解决方案很简单(大概),取自 Radim 的回答:JAXB in Netbeans Module
我只需要在模块 B 中添加对 JAXB API 的模块依赖(在原文 post 中有描述)。这是在运行时使用的 netbeans JAXB class,而不是 JDK 版本。如果不包含 JAXB API,也会出现如下错误(取自上述 link):
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 版本,而我派生的 class - 其主机模块在运行时加载 - 被解释为基础 class 由 JAXB 开发,基础 class 不完全兼容 JAXB。