【问题标题】:Unable to test RESTEasy JAX-RS implementaion for REST API无法测试 REST API 的 RESTEasy JAX-RS 实现
【发布时间】:2016-11-17 11:54:32
【问题描述】:

我有一个休息应用程序。我的目标是删除 IBM JAX-RS 并使用 RESTEasy JAX-RS 实现。我正在使用 WAS8,我只想使用这个。

为了禁用 IBM JAX-RS,我删除了 IBMRestServlet 和 IBMRestFilter 类,并在管理控制台中将 com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine JVM 属性设置为 tru。

对于 RESTEasy JAX-RS 实现,在 pom 中添加了 resteasy-jaxrs 依赖,并在 web.xml 中配置了 servlet

       <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>3.0.11.Final</version>
          </dependency>

Web.xml

  <context-param>
     <param-name>resteasy.servlet.mapping.prefix</param-name>
      <param-value>/</param-value>
  </context-param>

  <listener>
  <listener-class>
   org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
   </listener-class>
   </listener>

<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
  org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
   <init-param>
 <param-name>javax.ws.rs.Application</param-name>
 <param-value>com.application.RestApplication</param-value>
 </init-param>

  </servlet>

  <servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

A) 最初我得到“java.lang.NoSuchMethodError: org/jboss/resteasy/specimpl/BuiltResponse.getHeaders()”异常。查看各种答案,在 pom.xml 中添加以下依赖项(尽管这对我没有任何意义)

      <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>jaxrs-api</artifactId>
      <version>3.0.11.Final</version>
      </dependency>

B) 现在,我得到 java.lang.NoSuchMethodError: javax/ws/rs/ClientErrorException.validate(Ljavax/ws/rs/core/Response;Ljavax/ws/rs/core/Response$Status$家庭;Ljavax/ws/rs/core/Response)

您能帮我解决 A 和 B 异常吗?我只想在 WAS8 中尝试这个。

另外,我如何确定我已完全禁用 IBM JAX-RS 并且服务器只选择 REST Easy jaxrs。

【问题讨论】:

    标签: rest jax-rs websphere resteasy


    【解决方案1】:

    您是否将 Web 模块的类加载器设置为使用“最后一个父级”委托模式?这是在 WebSphere 中引入您自己的 JAX-RS 提供程序的必要部分。 “禁用”内置提供程序(通过您提到的系统属性)会阻止它初始化,但它的类仍然可以通过类加载器看到。您需要配置 Web 应用的类加载器,以确保它首先加载本地类。

    请注意,如果您担心“最后一个父级”设置会导致您的应用出现其他问题,您可以只将您的 JAX-RS API 和实现放入共享库中,将共享库设置为使用隔离类loader,并将其与您的 Web 模块相关联。这是一种更有针对性(因此也更安全)的方式来获得这种类加载方式。

    【讨论】:

    • 是的,我已经改了。我的应用程序类加载器顺序是先用本地类加载器加载的类(最后是父类)。
    • 再次检查您是否在 Web 模块而不是应用程序上设置了它 - 它们有单独的类加载器,必须单独配置该设置。如果 THAT 不能解决它,并且您确定 API 和实现 jar 都在具有该设置的加载器中,那么堆栈跟踪可能会帮助缩小范围 - 可能存在一些问题,从意外的范围。
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2014-02-03
    • 2017-12-11
    • 2016-12-18
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多