jax-rs - 如何将专有的 Apache CXF 功能添加到 Open Liberty

标签 jax-rs cxf websphere-liberty open-liberty jakarta-ee

我想使用专有的 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 代码,因此提供的范围将无法工作,并且使用我当前的解决方案(使用.war 文件)它会导致类加载器问题。

我在 Open Liberty 19.0.0.12 和 JDK 11 上运行

最佳答案

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

Liberty 采用了不同的方法。您可以使用 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 当然更适合 future 。

希望这有帮助!安迪

关于jax-rs - 如何将专有的 Apache CXF 功能添加到 Open Liberty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59244118/

相关文章:

web-services - 使用 JAXB 和 JAXWS 注释将枚举属性编码到 XML

servlets - Websphere 8.5 Liberty Profile - Servlet API setLocale

jaas - 是自由 : SSO Cookie not set on programmatic login

java - java Rest Web 服务中所有(也是可选的)查询参数的列表

java - Jetty + Jersey + Jackson,Eclipse(成功)与命令行(错误不支持的媒体类型)中的不同行为!

spring - 如何使用 Spring Boot 1.5.2 注入(inject) Jersey 端点接口(interface)的实现?

java - 将异常从 CXF 拦截器传播到异常映射器

maven - cxf.version 3.2.1 给出 org.apache.cxf.tools.common.ToolErrorListener 错误

web-services - 在 Websphere Liberty Profile 中使用 JAXRS 客户端 API(POST 请求)的 Http 客户端

java - 这个 JAX-RS Web 服务如何工作?