此规则与从版本低于 V7.0 的 WebSphere Application Server 迁移时可能发生的 Java XML 绑定体系结构 (JAXB) 初始化类更改和冲突相关。 有两种 JAXB 迁移场景会导致客户应用程序发生问题。 第一种场景与从 WebSphere 6.1 Feature Pack for Web Services 迁移的应用程序相关。 第二种场景与将 JAXB 实现打包且迁移到 WebSphere V7.0 或更高版本的客户应用程序相关。
在 WebSphere V7.0 中,JAXB 2.1 作为 Java 6 运行时的一部分来交付。
在 V7.0 之前,WebSphere 6.1 Feature Pack for Web Services 随附的 JAXB 2.0 使用了不同于 JAXB 2.1 或 2.2 (V8.0) 中使用的初始化类。
如果应用程序指定使用旧的初始化类,那么运行应用程序时可能会生成“找不到类”异常。
可以使用 javax.xml.bind.context.factory 属性来定义初始化类。 旧的初始化类是 com.sun.xml.bind.ContextFactory。
如果在 javax.xml.bind.context.factory 属性上设置旧类名,那么使用 Java 6 随附的 JAXB 库时,将收到 java.lang.ClassNotFoundException。
此规则会扫描以查找用来获取 JAXBContext 的 javax.xml.bind.JAXBContext.newInstance 方法。 如果使用的是 JAXB,那么应该检查应用程序是否使用了旧的上下文工厂。 此规则还将在 Java 代码中检测字符串字面值“com.sun.xml.bind.ContextFactory”或“com.sun.xml.bind.DefaultJAXBContextImpl”,但不会扫描通常在其中设置这些值的属性文件。
它们还可以在 Java 系统属性中进行设置。
通常从 jaxb.properties 文件装入 JAXB 属性。 手动扫描应用程序属性文件以确定是否定义了旧的上下文工厂。
要扫描 Eclipse 中的属性文件,请选择搜索 > 文件 ...。
在包含文本字段中,输入 com.sun.xml.bind.ContextFactory。
在文件名模式字段中,输入 *.properties。
重复搜索字符串 com.sun.xml.bind.DefaultJAXBContextImpl。
在 WebSphere V7 或 V8 中使用 JAXB 时,如果未设置 javax.xml.bind.context.factory 属性,那么缺省初始化类是 com.ibm.xml.xlxp2.jaxb.JAXBContextFactory。
对于第二种场景,如果客户已将 JAXB 实现打包为低于 V7 的应用程序的一部分,那么在迁移到 WebSphere V7.0 或更高版本时也可能会遇到这些问题(如上所述)或行为更改。 如果装入作为 Java 运行时一部分提供的 JAXB 2.1 或 2.2 版本,而不是装入应用程序随附的 JAXB 实现,那么会发生这种情况。 Enabling a third-party JAX-WS application in WebSphere Application Server V7 一文描述了如何在要继续使用 JAXB 实现时解决类装入器问题。
有关更多信息,请参阅以下参考: