如何向Open Liberty添加专有的Apache CXF功能

问题描述 投票:0回答:1

我想使用专有的Apache CXF功能(用于文件上传的多部分处理),该功能未包含在JAX-RS 2.1规范中。在我的Jakarta EE 8项目中添加以下依赖项会导致内部Apache CXF NPE异常:

<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-frontend-jaxrs</artifactId>
  <version>3.3.4</version>
</dependency>

错误:

[INFO] java.lang.NullPointerException
[INFO] [WARNING ] Exception in handleFault on interceptor org.apache.cxf.jaxrs.interceptor.JAXRSDefaultFaultOutInterceptor@5e2be3a2
[INFO] org.apache.cxf.interceptor.Fault
[INFO] [ERROR   ] An unexpected error occurred during error handling. No further error processing will occur.
[INFO] org.apache.cxf.interceptor.Fault
[INFO] [ERROR   ] SRVE0777E: Exception thrown by application class 'org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor.filter:64'
[INFO] java.lang.NullPointerException
[INFO]  at org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor.filter(JAXRSBeanValidationInInterceptor.java:64)
[INFO]  at [internal classes]
[INFO] 
[INFO] [ERROR   ] SRVE0315E: An exception occurred: java.lang.Throwable: java.lang.NullPointerException
[INFO]  at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:5075)
[INFO]  at [internal classes]
[INFO] Caused by: java.lang.NullPointerException
[INFO]  at org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor.filter(JAXRSBeanValidationInInterceptor.java:64)
[INFO]  ... 1 more

根据我对这个问题的研究,我的理解是,该应用程序无法访问内部CXF代码,因此作用域provided无法使用我的当前解决方案(将扩展名与.war文件一起运输)这会导致类加载器问题。

我在Open Liberty 19.0.0.12和JDK 11上运行

jax-rs cxf websphere-liberty open-liberty jakarta-ee
1个回答
0
投票

这是预期的行为。 Apache CXF具有许多超出JAX-RS规范的功能。过去,传统的WebSphere曾遇到过这样的问题:他们使用开源产品来提供某些功能,暴露该产品的所有包/类,然后用户会使用它们。当用户然后想要引入开源产品的不同版本或模块配置而不是应用程序服务器中可用的版本时,问题就开始了。因此,用户必须将自己的产品版本与他们的应用程序或共享库一起打包,并且必须诉诸类加载技巧,例如parent-last以避免加载该产品的IBM版本-这不可避免地会导致类加载问题,例如ClassCastExceptions。这种方法的另一个缺点是将IBM涂上了一个角落-例如,如果不再支持开放源代码产品(例如Apache Wink),则IBM无法换出开放源代码产品以提供也可以实现给定功能的替代产品。规格。

自由采取不同的方法。您可以使用IBM提供的功能,也可以将第三方库打包到您的应用程序(或共享库)中。这解决了上面列出的两个问题-但确实对您描述的方案有影响。

有几种不同的方法可以解决您的问题:

1]使用Open Liberty打开一个问题(或给现有问题+1),以正式支持您正在寻找的CXF专有功能。根据请求的功能,它可能需要为API使用不同的程序包名称,或者可能需要启用配置设置,等等。您可以在此处进行操作:https://github.com/OpenLiberty/open-liberty/issues

2]从server.xml的功能管理器列表中删除jaxrs-2.1功能,并将CXF库与您的应用程序打包在一起。您还需要打包JAX-RS API库。

3)您可以创建公开CXF API的用户功能(https://www.ibm.com/support/knowledgecenter/en/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_feat_develop.html)。这里需要注意的一点是,如果公开org.apache.cxf软件包,然后Liberty交换开放源代码提供程序(即切换到Jersey或RestEasy),则org.apache.cxf软件包将不再存在。这将有效地阻止您升级Liberty版本,直到升级用户功能以打包CXF模块为止。选项1和2当然更适合未来。

希望这会有所帮助!安迪

© www.soinside.com 2019 - 2024. All rights reserved.