在 Weblogic 12c (12.2.1.3) 中使用提供的 jax-rs 2.0 和 Jersey 2.1x
Use Provided jax-rs 2.0 and Jersey 2.1x in Weblogic 12c (12.2.1.3)
我需要在我的 WEB 应用程序中实现休息服务调用。按照Oracle的说法,Weblogic是支持的,不需要注册(部署)jax-rs,所以想用这些Server库。我通过调用服务(get)做了一个简单的class。我在项目中配置好依赖,部署在Weblogic上。但是部署的时候出现如下错误: java.lang.ClassCastException: Cannot cast org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider to org.glassfish.jersey.server.spi.ComponentProvider
注意:使用下面的 link 它有效(在服务器上部署 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 上,您不需要执行您指出的 link 描述的过程,我的意思是下面的 link。
https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297
这是因为link属于Oracle Weblogic 12.1.3并且Weblogic 12.1.3.0和Weblogic 12.2.1.3之间存在一些差异。
此外,this document 对于 Oracle Weblogic 12.2.1.3 状态。
Note:
Jersey 2.x (JAX-RS 2.0 RI) support is provided by default in this
release of WebLogic Server. Registration as a shared library is no
longer required.
这意味着,当涉及到 Weblogic 12.2.1.3 Jersey 库时,它们已经到位并可以使用了。因此,您的应用程序应该能够使用它们。
但是,我认为服务器库在您 pom.xml 文件中使用的库中遇到了问题。
此外 Oracle Weblogic 12.2.1.3 提供 jersey 2.22.4
我还在我的一台服务器上使用了 wls-cat 来了解哪个库正在加载 class 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
因此,cast 应该不是问题,这意味着 class 加载问题很可能是由您的应用程序中包含的库引起的。
你可以在下图中看到wls-cat在我的服务器上执行的结果
您可以使用 wls-cat 查看哪个文件(JAR 库)正在加载冲突 class。在下面 post 您将找到有关如何使用 wls-cat 分析 class 加载问题的信息。
https://blog.sysco.no/class/loader/AnalysingClassLoadingConflicts/
图书馆真的很矛盾。我从 pom.xml 中删除了这些依赖项并且它起作用了。感谢提示。
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
<scope>provided</scope>
</dependency>
<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.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>
我需要在我的 WEB 应用程序中实现休息服务调用。按照Oracle的说法,Weblogic是支持的,不需要注册(部署)jax-rs,所以想用这些Server库。我通过调用服务(get)做了一个简单的class。我在项目中配置好依赖,部署在Weblogic上。但是部署的时候出现如下错误: java.lang.ClassCastException: Cannot cast org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider to org.glassfish.jersey.server.spi.ComponentProvider
注意:使用下面的 link 它有效(在服务器上部署 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 上,您不需要执行您指出的 link 描述的过程,我的意思是下面的 link。
https://docs.oracle.com/middleware/1213/wls/RESTF/use-jersey20-ri.htm#RESTF297
这是因为link属于Oracle Weblogic 12.1.3并且Weblogic 12.1.3.0和Weblogic 12.2.1.3之间存在一些差异。
此外,this document 对于 Oracle Weblogic 12.2.1.3 状态。
Note:
Jersey 2.x (JAX-RS 2.0 RI) support is provided by default in this release of WebLogic Server. Registration as a shared library is no longer required.
这意味着,当涉及到 Weblogic 12.2.1.3 Jersey 库时,它们已经到位并可以使用了。因此,您的应用程序应该能够使用它们。
但是,我认为服务器库在您 pom.xml 文件中使用的库中遇到了问题。
此外 Oracle Weblogic 12.2.1.3 提供 jersey 2.22.4
我还在我的一台服务器上使用了 wls-cat 来了解哪个库正在加载 class 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
因此,cast 应该不是问题,这意味着 class 加载问题很可能是由您的应用程序中包含的库引起的。
你可以在下图中看到wls-cat在我的服务器上执行的结果
您可以使用 wls-cat 查看哪个文件(JAR 库)正在加载冲突 class。在下面 post 您将找到有关如何使用 wls-cat 分析 class 加载问题的信息。
https://blog.sysco.no/class/loader/AnalysingClassLoadingConflicts/
图书馆真的很矛盾。我从 pom.xml 中删除了这些依赖项并且它起作用了。感谢提示。
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
<scope>provided</scope>
</dependency>
<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.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>