Websphere Liberty 似乎覆盖了通过 jvm.options 设置的系统 属性 TransformerFactory

Websphere Liberty seems to override System Property TransformerFactory set via jvm.options

我正在尝试将使用 camel/cxf(提供一些包含转换的 Web 服务)的遗留应用程序迁移到 Websphere Liberty 16.0.0.03 (IBM JRE 1.8)。测试失败,因为该应用程序使用了扩展功能。我试图按照 here.

所述禁用安全处理

此更改无效。这就是为什么我尝试通过在 jvm.options 配置文件中设置系统 属性 "javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl" 来全局切换到撒克逊实现。再次 - 这是行不通的。

在调试时我可以看到,com.ibm.ws.webcontainer.osgi.mbeans.PluginGenerator$2 在服务器启动期间用 com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl 覆盖了 属性。我可以在堆栈中看到一个似乎触发更改的方法 "PluginGenerator.revertTransformerFactoryIfNeccessary"。之后所有 FactoryFinder.find() 将 return 非撒克逊实现。

任何人都可以建议如何成功禁用安全处理

一种成功设置自定义 TransformerFactory 的方法?

顺便说一句:在我看来,这 2 个是错误 - 我是否将它们报告为常规 PMR?

EDIT: possible workaround

作为有用建议的结果,我添加了一个“@WebListener”,它将在构造函数中设置系统 属性(在 contextInitialized 中设置它为时已晚,因为样式表似乎是在应用程序启动期间编译的,因此处理失败测试)。我将此 "patch-jar" 与旧版应用捆绑在一起。

我同意这是一个错误。报告问题的官方途径是 PMR,但这里足以让我们了解问题并通过我们的测试版程序修复它。如果您想在产品的已发布版本上获得 iFix(而不是等待它通过 Beta 程序推出),那么您需要提高 PMR。

如果使用 IBM JDK,Liberty Web 容器插件生成器将仅覆盖 xml 转换器工厂。

当 Web 容器使用 IBM JDK 执行插件生成时,它会切换到备用转换器工厂,然后重置为 IBM JDK 默认值 com.ibm.xtq.xslt.jaxp.compiler.TransformerFactoryImpl .

我觉得这里值得开一个PMR。 PluginGenerator 不应该假设它是从默认的 xml 变压器工厂开始的,而是应该保存 javax.xml.transform.TransformerFactory 的值,然后在插件生成完成后恢复它。

临时解决方法:
由于 PluginGenerator 仅交换 XML 变压器工厂,如果你是 运行 在 IBM JDK 上,你可以更改为备用 JDK 直到你的 PMR 得到已解决。