【问题标题】:How to override code to use jersey and Jax-RS jars available in WEB-INF\lib?如何覆盖代码以使用 WEB-INF\lib 中可用的 jersey 和 Jax-RS jar?
【发布时间】:2016-05-19 17:09:42
【问题描述】:

服务器:Weblogic 10.3.6.0

IDE:JDeveloper 11.1.1.7.0

我在this blog 之后创建了一个 java restful web 服务。如博客中所述,我在项目中添加了两个 jar:javax.ws.rs-api-2.0.jar 和 jersey-bundle-1.9.jar 作为库。部署进行得很好,并且 url 有效。

现在,我将这两个 jars 作为 jars 而不是作为库包含在项目中。我执行了 main 方法来测试和部署项目 war 文件,效果很好。但是部署后,当我调用其余的 url 时,我收到错误:

Error 500--Internal Server Error

java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;
    at javax.ws.rs.core.UriBuilder.fromUri(UriBuilder.java:119)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:662)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:119)
    at java.security.AccessController.doPrivileged(Native Method)
    at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:324)
    at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:460)
    at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:103)
    at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:171)
    at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:71)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:163)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3730)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2273)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1490)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

web.xml 文件为:

<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
  <servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>*</url-pattern>
  </servlet-mapping>
</web-app>

weblogic.xml 是:

<?xml version = '1.0' encoding = 'windows-1252'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
  <library-ref>
    <library-name>jax-rs</library-name>
    <specification-version>1.1</specification-version>
    <implementation-version>1.9</implementation-version>
    <exact-match>false</exact-match>
  </library-ref>
</weblogic-web-app>

不确定,如果我想将代码重定向到项目中存在的 jar,则 web.xml 和 weblogic.xml 是否存在问题。

我已在 weblogic.xml (Oracle blog) 中阅读了有关 &lt;prefer-web-inf-classes&gt;true&lt;/prefer-web-inf-classes&gt; 的信息,但是我无法理解要在 web.xml 文件中进行的更改。

如何强制我的应用程序使用 WEB-INF/lib 文件夹中的 jersey 和 jax-rs jar?

【问题讨论】:

    标签: java rest jersey weblogic jdeveloper


    【解决方案1】:

    我使用此代码工作。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        <servlet>
            <servlet-name>jersey-servlet</servlet-name>
            <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
            <!-- Register resources and providers -->
            <init-param>
                <param-name>jersey.config.server.provider.packages</param-name>
                <param-value>com.jersey.series.upload.download.service</param-value>
            </init-param>
            <init-param>
                <param-name>jersey.config.server.provider.classnames</param-name>
                <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    </web-app>

    【讨论】:

    • 虽然您提供的代码可能包含对 OP 问题的答案 - 如果没有说明您如何解决他们的问题,该帖子并不是很有用。
    【解决方案2】:

    我替换了 lib 文件夹中的所有 jar,并导入了从 Jersey 1.19 ZIP bundle 下载的所有 jar。我阅读了javarevisited blog 并在 web.xml 和 weblogic.xml 中进行了以下更改

    web.xml:

    <?xml version = '1.0' encoding = 'windows-1252'?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
      <display-name>JerseyServer</display-name>
      <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
          <param-name>jersey.config.server.provider.packages</param-name>
          <param-value>com.oracle.rest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>*</url-pattern>
      </servlet-mapping>
    </web-app>
    

    weblogic.xml:

    <?xml version = '1.0' encoding = 'windows-1252'?>
    <weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                      xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
        <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
      </container-descriptor>
    </weblogic-web-app>
    

    我能够成功部署和调用其余 url。

    注意:我也试过Jersey JAX-RS 2.0 RI bundle。它在我的本地服务器上运行良好。但是远程 weblogic 服务器与编译的类版本不兼容。部署时的错误是:'org/glassfish/jersey/servlet/ServletContainer : unsupported classversion 51.0'

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 2022-08-16
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2014-08-10
      • 2011-02-19
      相关资源
      最近更新 更多