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

我已经更新了项目(基于Websphere 8.5的Java EE),以使用公司内部框架的新版本(以及Ejb

3.x部署描述符,而不是2.x部署描述符)。从那时起,我的集成测试失败,但出现以下异常:

 [java.lang.ClassNotFoundException: com.ibm.xml.xlxp2.jaxb.JAXBContextFactory]

我可以使用先前的框架版本构建应用程序,并且一切正常。调试时,我注意到ContextFinder(javax.xml.bind)中有两种不同的行为:

  1. 先前版本(一切正常):所有地方都没有调出工厂类,因此将加载默认工厂类com.sun.xml.internal.bind.v2.ContextFactory(在该类中定义为String常量)。 。

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

  1. 那是什么资源?因为在我们的EAR内部有两个WAR,而这两个WAR都不在其META-INF目录中包含文件夹服务。

  2. 那个价值可能从何而来呢?因为filediff没有显示任何新的或更改的属性文件。

无需多说,我将阅读所有有关JAXB配置可能性的信息,但如果您对可能出错的内容有第一见,或者可以帮助我使用该资源(我是否要查找真实文件?)很多。非常感谢!

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

确实(我有点惊讶),该框架在EAR内部具有一个自定义的eclipselink-2.4.1-.jar,其中包括JAXB实现和jaxb.properties文件,该文件在两个版本中均显示以下条目(即找到工厂以及引发异常的工厂):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

我认为这与当前问题无关,因为两个EAR中的jar保持完全相同(运行的那个/期望的那个)

我还不清楚为什么旧版本的框架曾经选择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";

使用框架的先前版本(和EJB 2.x部署描述符)进行构建,一切正常。在调试时,我可以看到没有找到任何配置,并且上述默认工厂已加载。

使用新版本的框架(和EJB

3.x部署描述符,以便我可以部署)进行构建,只有TESTCASE会失败,但是其余功能可以正常工作(例如我可以将请求发送到我们的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的更新版本,该更新版本包含一个JAXBFactory的定义,该定义在发生错误的组件中不可用。在大多数情况下,使用包含相同定义的jaxb.propertie文件或JAXBContext文件配置设置JAXB上下文工厂。适当的JAXBContextFactory的详细加载过程在javax.xml.bind.ContextFinder中进行。

该错误尚未解决(在超过4个主要EE /

SE应用程序导致错误的情况下),并且没有一般性的答案,但已定义的JAXBContextFactory必须存在于类路径中(真是一个奇迹…),所以您要么出现那个ClassNotFound错误,是因为您缺少资源(这可能是造成这种情况的原因),或者是您在上述任何属性文件中定义的JAXBContextFactory错误,该文件包含根据以下答案的定义。

非常感谢您的出色评论和支持,非常感谢!

回答:

您可以将jaxb.properties文件包含在与域模型相同的程序包中,以指定要使用的JAXB(

)实现。例如,如下所示将 指定为您的JAXB提供程序。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

  • http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html

以上是 设置要使用的JAXB上下文工厂初始化类 的全部内容, 来源链接: utcz.com/qa/397911.html

回到顶部