【问题标题】:RestEasy running on WebSphere 8.5在 WebSphere 8.5 上运行的 RestEasy
【发布时间】:2020-06-10 02:25:10
【问题描述】:

我是 RestFul API 的新手,遇到了这个 https://www.journaldev.com/9189/resteasy-tutorial-eclipse-tomcat。本教程在 Tomcat 上运行良好,但在 WebSphere 8.5 上遇到 404。 我可以在启动过程中看到 SystemOut.log 中打印的以下内容。

[6/9/20 18:15:54:460 SGT] 0000004a ServletWrappe I com.ibm.ws.webcontainer.servlet.ServletWrapper init SRVE0242I: [backoffice] [/secure/backoffice] [ResteasyServlet]: 初始化成功.

Classloader at server level

Classloader at application level

在 J2EE 日志中未找到错误代码,但在 Web 错误日志中发现以下错误。 [2020 年 6 月 11 日星期四 10:34:57] [错误] [客户端 10.128.1.22] 文件不存在:/sldev/scb/dev/ist/web_bkoff/secure/backoffice/rest

我在 IBM 网站上尝试了下面的教程,但我仍然遇到同样的问题 https://www.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.multiplatform.doc/ae/twbs_jaxrs_getstarted.html

SystemOut.log

<servlet>
    <servlet-name>HelloWorldApp</servlet-name>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.ibm.jaxrs.sample.HelloWorldAppConfig</param-value>
    </init-param>
    <load-on-startup>9</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorldApp</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

【问题讨论】:

  • 一般来说,您应该使用服务器提供的 JAX-RS 实现,而不是第三方。因此,如果您要部署到 8.5.x,然后是 JAX-RS 1.1,如果您需要 JAX-RS 2.x,那么使用 WebSphere/Open Liberty。如果您确实需要使用第三方库,请使用它们作为最后的手段。

标签: resteasy websphere-8


【解决方案1】:

如果我不得不猜测,问题很可能是 WebSphere 8.5 提供了 JAX-RS 1.1 API,但您引用的文章使用了 JAX-RS 2.0。当前版本的 RESTEasy 使用 JAX-RS 2.1 API。

RESTEasy 实现了 JAX-RS API。这允许用户对 JAX-RS API 进行编码,然后在任何兼容的实现上运行 - 例如 CXF、Jersey、RESTEasy 等。但如果实现与 API 版本不匹配,您可能会遇到问题。

Tomcat 不打包任何 JAX-RS API,因此它将使用与应用程序一起打包的 API - 这应该与 RESTEasy 的期望相匹配。但由于 WebSphere 提供了它自己的 API 版本(并且它自己的实现,基于 Apache Wink),您可能会遇到这些问题。

WebSphere v9.0 能够将 API 版本切换为使用 2.0,而 WebSphere Liberty(或 Open Liberty)能够完全启用/禁用不同版本的 JAX-RS。不幸的是,WebSphere v8.5 无法禁用 JAX-RS API。

如果您可以升级到 v9.0 或切换到 Liberty,那很可能会解决此问题。如果升级不是一个选项,您可能仍然可以使其在 WebSphere v8.5 中工作,但这不是一个很好的解决方案:您可以使用 parent-last 类加载委托,以便您的应用程序加载 RESTEasy 和 JAX-RS 2 .X API 类从应用程序的类加载器之前从 WebSphere 的类加载器加载 JAX-RS 1.1/Wink 类。有关 parent-last 的更多信息: https://www.ibm.com/support/knowledgecenter/SS7K4U_8.5.5/com.ibm.websphere.zseries.doc/ae/urun_rclassloader_inst.html

或者,您可以将 JAX-RS 2.X API JAR 和 RESTEasy 打包到一个独立的共享库中,并将该库与应用程序相关联。隔离的共享库是父级最后的,但将应用程序类加载器保留在父级优先。有关隔离共享库的更多信息,请点击此处: https://www.ibm.com/support/knowledgecenter/SSEQTP_8.5.5/com.ibm.websphere.base.iseries.doc/ae/tcws_sharedlib.html

希望这会有所帮助!

【讨论】:

  • 感谢您的评论。我尝试将应用程序和服务器级别的类加载器更改为“首先使用本地类加载器(最后一个父类)加载的类”以及共享库,但它没有帮助。
  • 您能否更新您的帖子以提供有关失败的更多详细信息?是否有任何日志消息、返回码等?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
相关资源
最近更新 更多