Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置要使用的JAXB上下文工厂初始化类_Java_Jaxb_Websphere - Fatal编程技术网

Java 设置要使用的JAXB上下文工厂初始化类

Java 设置要使用的JAXB上下文工厂初始化类,java,jaxb,websphere,Java,Jaxb,Websphere,我已经更新了我们的项目(运行在WebSphere8.5上的基于JavaEE的项目),以使用公司内部框架的新版本(以及EJB3.x部署描述符,而不是2.x部署描述符)。此后,我的集成测试失败,出现以下异常: [java.lang.ClassNotFoundException: com.ibm.xml.xlxp2.jaxb.JAXBContextFactory] javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBCon

我已经更新了我们的项目(运行在WebSphere8.5上的基于JavaEE的项目),以使用公司内部框架的新版本(以及EJB3.x部署描述符,而不是2.x部署描述符)。此后,我的集成测试失败,出现以下异常:

 [java.lang.ClassNotFoundException: com.ibm.xml.xlxp2.jaxb.JAXBContextFactory]
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
我可以使用以前的框架版本构建应用程序,并且一切正常。 调试时,我注意到ContextFinder(javax.xml.bind)中有两种不同的行为:

  • 以前的版本(一切正常):没有任何不同的地方会显示factory类,因此会加载默认的factory类,即com.sun.xml.internal.bind.v2.ContextFactory(在类中定义为字符串常量)

  • 升级版本(ClassNotFound):成功加载了一个资源“META-INF/services/javax.xml.bind.JAXBContext”,第一行读取使ContextFinder尝试加载“com.ibm.xml.xlxp2.jaxb.JAXBContextFactory”,从而导致错误

  • 我现在有两个问题:

  • 那是什么资源?因为在我们的耳朵里有两场战争,而这两场战争中没有一场包含文件夹服务 META-INF目录

  • 否则,该值会从何而来?因为filediff没有显示新的或更改的属性文件

  • 不用说,我将阅读所有关于JAXB配置的可能性,但是如果您对可能出现的错误有了初步的了解,或者能够帮助我解决这些资源(这是我必须查找的真实文件吗?),我将不胜感激。非常感谢

    编辑(根据评论输入/问题):


    出于好奇,您的框架是否包含JAXB JAR?您的框架的旧版本是否包含jaxb.properties

    事实上(我有点惊讶)该框架在EAR中有一个定制的eclipselink-2.4.1-.jar,它包括一个JAXB实现和一个JAXB.properties文件,该文件在两个版本中都显示以下条目(找到工厂的版本和抛出异常的版本):

    我认为这与当前的问题无关,因为jar在两只耳朵中保持完全相同(运行的那只/带有expection的那只)

    我也不清楚为什么旧版本的框架会选择com.sun实现

    有一个类javax.xml.bind.ContextFinder负责初始化JAXBContextFactory。此类在不同位置搜索jaxb.properties文件或“javax.xml.bind.JAXBContext”资源的存在。如果所有这些位置都没有显示要使用的上下文工厂,则会加载一个在类本身中硬编码的deault工厂:

    private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";
    
    现在回到我的问题:

    使用以前版本的框架(和EJB2.x部署描述符)进行构建(一切正常)。在调试期间,我可以看到没有找到任何配置,因此加载了上述默认工厂

    使用新版本的框架(以及EJB3.x部署描述符,这样我就可以进行部署)构建时,只有一个测试用例失败,但其余的功能可以工作(比如我可以向我们的Web服务发送请求,它们不会触发任何错误)。在调试时,我可以看到找到了一个配置。此资源名为“META-INF/services/javax.xml.bind.JAXBContext”。下面是关于此资源如何导致尝试加载“com.ibm.xml.xlxp2.jaxb.JAXBContextFactory”的最重要的几行代码,该代码随后抛出ClassNotFoundException。这是上述javax.xml.bind.ContextFinder类的简化源代码:

    URL resourceURL = ClassLoader.getSystemResource("META-INF/services/javax.xml.bind.JAXBContext");
    
    BufferedReader r = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "UTF-8"));
    
    String factoryClassName = r.readLine().trim();  
    
    字段factoryClassName现在的值为'com.ibm.xml.xlxp2.jaxb.JAXBContextFactory'

    因为这已经成为一个超级大的问题,我还要加上一个悬赏:) 我会为此工作一整天,如果有任何消息,我会告诉你

    更新/解决方案

    这个问题已经解决了。出现最初的问题是因为复杂构建多模型maven项目的配置错误,其中一个依赖项使用了自定义eclipse链接jar的更新版本,其中包含发生错误的组件中不可用的JAXBFFactory定义。在大多数情况下,使用包含相同定义的JAXB.property文件或JAXBContext文件配置JAXB上下文工厂。适当的JAXBContextFactory的详细加载过程发生在javax.xml.bind.ContextFinder中

    该错误尚未解决(在超过4个主要的EE/SE应用程序导致该错误的过程中),并且没有一般的答案,但是定义的JAXBContextFactory必须存在于您的类路径中(哇,这真是一个奇迹…),因此您要么因为缺少资源而出现了该类未找到的错误(这是偶然的原因)或者因为您在上述任何属性文件中定义了错误的JAXBContextFactory,这些属性文件包含符合以下答案的定义


    非常感谢您的宝贵意见和支持,我真的非常感谢

    您可以在与域模型相同的包中包含一个
    jaxb.properties
    文件,以指定希望使用的jaxb()实现。例如,指定JAXB提供程序如下所示

    javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    
    了解更多信息

    另一个对我有效的快速而肮脏的解决方案(实际上是一种变通方法)是在maven构建中显式地包含JAXB实现。比如说

    
    javax.xml.bind
    jaxb api
    2.2.7
    com.sun.xml.bind
    jaxb impl
    2.2.7
    
    请注意,这在某种程度上为您的构建添加了一个不必要的依赖项,因为JAXB显然已经是每个JRE>=版本6的一部分


    很可能只有当WAS类加载器设置为parent last时,此功能才起作用。

    非常感谢您的编辑!O