java - 在 Weblogic 12c (12.2.1.3) 中使用提供的 jax-rs 2.0 和 Jersey 2.1x
问题描述
我需要在我的 WEB 应用程序中实现一个休息服务调用。根据Oracle的说法,支持Weblogic,不需要注册(部署)jax-rs,所以我想使用这些Server库。我通过调用服务(get)做了一个简单的类。我在项目中配置了依赖,并部署在Weblogic上。但是部署的时候出现如下错误:java.lang.ClassCastException: Cannot cast org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider to org.glassfish.jersey.server.spi.ComponentProvider
注意:它使用下面的这个链接(在服务器上部署 jar)但我想在 Weblogic 上使用本机库。有人可以帮我吗?
https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297
Code example (Java)
String host = "https://swapi.dev/api/people/2/";
Client client = ClientBuilder.newBuilder().build();
WebTarget webTarget = client.target(host);
Builder builder = webTarget.request(MediaType.APPLICATION_JSON);
String result = builder.get(String.class);
pom.xml
<properties>
<primefaces.version>3.5.RC1</primefaces.version>
<jersey.version>2.21.1</jersey.version>
<jaxrs.version>2.0</jaxrs.version>
</properties>
<!-- JAX-RS -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${jaxrs.version}</version>
<scope>provided</scope>
</dependency>
<!-- Jersey 2.21.1 -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.4.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
weblogic.xml
<wls:weblogic-version>12.2.1.3</wls:weblogic-version>
<wls:context-root>RecebimentoMercadoriaWEB</wls:context-root>
<wls:library-ref>
<wls:library-name>jsf</wls:library-name>
</wls:library-ref>
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
<wls:session-descriptor>
<wls:cookie-name>CookieRecebimentoMercadoria</wls:cookie-name>
</wls:session-descriptor>
<wls:container-descriptor>
<wls:prefer-application-packages>
<wls:package-name>javax.faces.*</wls:package-name>
<wls:package-name>com.sun.faces.*</wls:package-name>
<wls:package-name>com.sun.facelets.*</wls:package-name>
<wls:package-name>com.bea.faces.*</wls:package-name>
</wls:prefer-application-packages>
<wls:prefer-application-resources>
<wls:resource-name>javax.faces.*</wls:resource-name>
<wls:resource-name>com.sun.faces.*</wls:resource-name>
<wls:resource-name>com.sun.facelets.*</wls:resource-name>
<wls:resource-name>com.bea.faces.*</wls:resource-name>
<wls:resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</wls:resource-name>
<wls:resource-name>META-INF/services/com.sun.faces.spi.FacesConfigResourceProvider</wls:resource-name>
</wls:prefer-application-resources>
</wls:container-descriptor>
解决方案
在 Weblogic 12.2.1.3 上,您不需要执行您所指向的链接所描述的过程,我的意思是下面的链接。
https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297
这是因为该链接属于Oracle Weblogic 12.1.3,并且 Weblogic 12.1.3.0 和 Weblogic 12.2.1.3 之间存在一些差异。
此外,Oracle Weblogic 12.2.1.3的本文档指出。
笔记:
此版本的 WebLogic Server默认提供Jersey 2.x (JAX-RS 2.0 RI)支持。 不再需要注册为共享库。
这意味着,当涉及到 Weblogic 12.2.1.3 Jersey 库时,它们已经就位并且可以使用了。因此,您的应用程序应该能够使用它们。
但是,我认为服务器库遇到了您在 pom.xml 文件中使用的库的问题。
此外,Oracle Weblogic 12.2.1.3 提供球衣 2.22.4
我还在我的一台服务器中使用了 wls-cat 来了解哪个库正在加载类org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider,我在$ORACLE_HOME/oracle_common/modules/org 中找到了该库。 glassfish.jersey.ext.cdi.jersey-cdi1x.jar,这意味着它由 Weblogic 加载,如上述文档所述。
此外,运行 wls-cat 后,我可以看到:
org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider implements org.glassfish.jersey.server.spi.ComponentProvider
因此,强制转换应该不是问题,这意味着有一个类加载问题很可能是由应用程序中包含的库引起的。
您可以在下图中看到在我的服务器上执行的wls-cat的结果
您可以使用wls-cat查看哪个文件(一个 JAR 库)正在加载冲突的类。在下面的帖子中,您将找到有关如何使用wls-cat分析类加载问题的信息。
https://blog.sysco.no/class/loader/AnalysingClassLoadingConflicts/
推荐阅读
- python - PythonAnywhere 的 Instagram 私有 API 错误
- angular - Angular router.navigate 不导航
- unity3d - 我打了一些捷径,现在我的轴心点不在对象的中心
- nearprotocol - 如何将在近钱包之外创建的启用分类帐的帐户添加到近钱包?
- javascript - 从子类本身获取js父类名而不是它的实例?
- keras - 将 GPU 用于视频数据集时出现内存不足错误
- javascript - 循环数组未定义
- javascript - 猫鼬 userSchema.pre("save") 不工作
- sql-server - 为什么 SQL Server Profiler 不显示某些 TextData 值
- c++ - 忽略模板参数