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

Jboss EclipseLink Moxy在实例化JAXB上下文时无法加载自定义DomHandler类,jboss,jaxb,jax-rs,eclipselink,moxy,Jboss,Jaxb,Jax Rs,Eclipselink,Moxy,我在项目中使用JAXB的Eclipselink Moxy实现,使用XmlAnyElement将复杂的XML映射到字符串对象。 为此,我实现了名为LayouthHandler的DomHandler。 我将JAXB用于JBoss6中部署的resteasy web服务 我时断时续地面对下面的问题- Exception [EclipseLink-50033] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclips

我在项目中使用JAXB的Eclipselink Moxy实现,使用XmlAnyElement将复杂的XML映射到字符串对象。 为此,我实现了名为LayouthHandler的DomHandler。 我将JAXB用于JBoss6中部署的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)
在花了一些时间调试和分析这个问题之后,我发现resteasy的类加载器已经习惯于加载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);
    }
在上面的方法中,第一个类的classloader将用于稍后加载自定义DOMDhandler。 当数组中的第一个元素是模型类时,随着应用程序上下文类加载器的使用,代码工作正常,但当数组中的第一个元素是JaxbCollection rest easy上下文类加载器时,代码工作正常,并且抛出了提到的异常

当数组中元素的顺序发生变化时,此问题会间歇性出现,这可能是由于通过传递classesToBeBound数组的此方法的调用方使用HashSet来保存Class类型的元素

注意:我已将实际的包名替换为*


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

@Iscoughlin我已在jaxb.properties中指定moxy作为jaxb提供者。我花了更多的时间调试它,并深入研究了产生这种情况的根本原因。我已经在eclipse链接论坛上发布了详细的原因-