Enums OSGi依赖项hell:ClassNotFoundException:org.eclipse.persistence.internal.jaxb.WrappedValue

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

我在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.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.*