Enums OSGi依赖项hell:ClassNotFoundException:org.eclipse.persistence.internal.jaxb.WrappedValue
我在Equinox、Jersey和MOXy有工作环境。Jersey使用MOXy解析JSON并绑定到bean对象。将某个@XmlRootElement类的一个字段类型更改为enum后,我得到:Enums OSGi依赖项hell:ClassNotFoundException:org.eclipse.persistence.internal.jaxb.WrappedValue,enums,jaxb,osgi,moxy,equinox,Enums,Jaxb,Osgi,Moxy,Equinox,我在Equinox、Jersey和MOXy有工作环境。Jersey使用MOXy解析JSON并绑定到bean对象。将某个@XmlRootElement类的一个字段类型更改为enum后,我得到: java.lang.NoClassDefFoundError: org/eclipse/persistence/internal/jaxb/WrappedValue at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.Class
java.lang.NoClassDefFoundError: org/eclipse/persistence/internal/jaxb/WrappedValue
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
at org.eclipse.persistence.internal.jaxb.JaxbClassLoader.generateClass(JaxbClassLoader.java:124)
at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateWrapperClass(MappingsGenerator.java:3232)
...
MOXy束似乎很好:
osgi> lb -l
...
50|Active | 4|initial@reference:file:plugins/org.eclipse.persistence.moxy_2.6.0.v20150309-bf26070.jar
...
jar中有一个类
$ jar tf plugins/org.eclipse.persistence.moxy_2.6.0.v20150309-bf26070.jar | grep Wrapped
org/eclipse/persistence/internal/jaxb/WrappedValue.class
并将其包装出口
osgi> bundle 50
...
Exported packages
org.eclipse.persistence.internal.jaxb; version="2.6.0"[exported]
...
那么为什么我要得到ClassNotFoundException呢
编辑:
邦德斯:
导致问题的数据模型更改:
发件人:
致:
用法如下所示:
@XmlRootElement
public class User implements Principal, Serializable {
private static final long serialVersionUID = 1L;
...
private List<Role> roles = new ArrayList<Role>();
...
我相信这可能是由于使用JAXB的捆绑包中的导入包清单头中缺少条目造成的。我有一个类似的stacktrace,当我添加
org.eclipse.persistence.jaxb
时,它工作了
参见Maven Bundle插件的以下代码段:
org.apache.felix
maven捆绑插件
org.eclipse.persistence.jaxb,
*
您的OSGi清单文件中缺少导入包。仅将此行添加到清单文件中,该行位于角色
类所在捆绑包的manifest.MF
中:
DynamicImport-Package: org.eclipse.persistence.internal.*,org.eclipse.persistence.internal.jaxb.*
顺便说一句,您不需要
@XmlEnum(String.class)
在角色
类上方添加注释,将其作为一个简单的POJO,它将起作用。除了@ChristofferSoop answer
如果您在eclipse环境中工作,只需将MOXy捆绑包添加到依赖项列表中。它看起来不像OSGi,更像是类加载器问题。你能提供更多关于如何重现这一点的细节吗?@IaroslavSavytskyi让我的应用程序在OSGi中运行真是一件痛苦的事(我承认,很多都是由Equinox和它的Eclipse工具引起的)。容器中有57个捆绑包,只是为了制作一个简单的基于Jersey的RESTAPI+Mongodb。我认为你或其他人试图复制它是没有意义的。若你们说这可能是类加载器的问题,那个么我将从enum切换回类,或者从OSGi切换回经典web应用。谢谢你的评论。我自欺欺人地说,也许是我的配置出了一些愚蠢的问题。这是春分,不是费利克斯,马文也没有参与其中。问题的根源可能是Equinox的缓存机制。好吧,酷!但请注意,即使存在缓存问题,该错误也表明存在类似于我所经历的类加载问题(参见stacktrace)。我通过将正确的包添加到包的
MANIFEST.MF
文件中的OSGI头Import-package
,解决了这个问题。如果此头出现在捆绑包的清单中,那么它显然不是错误的来源。我使用Felix提供的maven bundle插件来实现这一点,这是附带的答案;我还不如在创建JAR文件之前手动编辑清单。干杯我不能再测试它了,因为MOXy已经从项目中删除了,但是声明导入内部包在设计上看起来是错误的。@SewerynNiemiec请记住,internal
包仅用于maven bundle plugin
,它不是OSGi规范,它只告诉插件不要在清单中导出该包和其中的任何东西,但在这种情况下,MOXy库确实导出了该包(因此看起来他们根本没有使用maven bundle插件)。当他们把这个包导出时,它说你可以导入它。您的编译器不会自动添加此导入,因为您对它没有直接依赖关系,所以您必须通过添加此行手动包含它。它起作用了。
@XmlEnum(String.class)
public enum Role {
@XmlEnumValue("common") COMMON ("common"),
@XmlEnumValue("registrant") REGISTRANT ("registrant"),
@XmlEnumValue("laborant") LABORANT ("laborant"),
...
@XmlRootElement
public class User implements Principal, Serializable {
private static final long serialVersionUID = 1L;
...
private List<Role> roles = new ArrayList<Role>();
...
@PUT @Path("/{name}")
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
public Response register(@PathParam("name") String name, @Valid User user) {
...
DynamicImport-Package: org.eclipse.persistence.internal.*,org.eclipse.persistence.internal.jaxb.*