EclipseLink-Moxy无法在实例化JAXB上下文时加载自定义DomHandler类

Mur*_*rli 5 jboss jax-rs jaxb eclipselink moxy

我在我的项目中使用Eclipselink Moxy实现JAXB,使用XmlAnyElement将复杂的XML映射到String对象.为此,我实现了名为LayoutHandler的DomHandler.我正在使用JAXB来部署在JBoss 6中的resteasy Web服务.

我间歇性地面对下面的问题 -

    Exception [EclipseLink-50033] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): 
org.eclipse.persistence.exceptions.JAXBException
Exception Description: The DomHandlerConverter for DomHandler 
[com.**.LayoutHandler] set on property [layoutXml] could not be 
initialized.
Internal Exception: java.lang.ClassNotFoundException: 
com.**.LayoutHandler from 
BaseClassLoader@5c0b3ad0{vfs:///*/*/jboss-server/server/all/deployers/resteasy.deployer}
    While EclipseLink Moxy is instantiating JAXBContext using JAXBContext.newInstance(classes, properties)
Run Code Online (Sandbox Code Playgroud)

在花了一些时间调试和分析问题后,我可以发现resteasy的ClassLoader习惯于加载LayoutHandler类而不是我的应用程序类加载器(vfs:/// //jboss-server/server/all/deploy/app_name .ear/app_name.war /)导致该问题无法找到LayoutHandler类.

当我退回服务器时,问题得到解决,所以我无法找到确切的根本原因.任何帮助将不胜感激.

进一步调试到org.eclipse.persistence.jaxb.JAXBContextFactory后发现,下面两个类被传递给JAXBContextFactory的createContext()方法 -

org.jboss.resteasy.plugins.providers.jaxb.JaxbCollection
com.**.Model_class

public static javax.xml.bind.JAXBContext createContext(Class[] classesToBeBound, Map properties) throws JAXBException {
        ClassLoader loader = null;
        if (classesToBeBound.length > 0) {
            loader = classesToBeBound[0].getClassLoader();
        }
        return createContext(classesToBeBound, properties, loader);
    }
Run Code Online (Sandbox Code Playgroud)

在上面的方法中,第一类的类加载器后来习惯于加载自定义的DomHandler.当数组中的第一个元素是模型类时,代码工作正常,因为应用程序上下文类加载器正在使用但是当数组中的第一个元素是JaxbCollection时,其余的简单上下文类加载器正在被使用并且它抛出提到的异常.

这个问题是间歇性发生的,因为数组中元素的顺序是变化的,这可能是由于使用HashSet来保存类型为Class的元素,这个方法的调用方传递了classesToBeBound数组

注意:我用*替换了实际的包名.

lsc*_*lin 0

我很惊讶它能反弹......你所有的 JAXB 位都需要对齐,你应该始终使用 moxy jaxb 提供程序。如果在初始部署后失败,然后在反弹后工作,我怀疑您想在系统属性中指定 moxy jaxb 提供程序( -Djavax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory )并确保在您的应用程序未部署时它们可供 jboss 使用。