首页 > 解决方案 > 在 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>

标签: javarestmavenweblogic12c

解决方案


在 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/


推荐阅读