【问题标题】:Does Tomcat support JAX-RS out of the box (is it JAX-RS aware)?Tomcat 是否支持开箱即用的 JAX-RS(是否支持 JAX-RS)?
【发布时间】:2015-07-22 11:33:58
【问题描述】:

从教科书《RESTful Java with JAX-RS》中我们可以读到:

如果我们的应用程序服务器支持 JAX-RS,或者换句话说,与 JAX-RS 紧密集成,请将我们的 ShoppingApplication 类声明为 servlet:

<?xml version="1.0"?>
<web-app>
  <servlet>
    <servlet-name>Rest</servlet-name>
    <servlet-class>
      com.restfully.shop.services.ShoppingApplication
    </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Rest</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app> 

如果我们的应用程序服务器不支持 JAX-RS,则您必须指定处理 JAX-RS 调用的 JAX-RS 提供者的 servlet。 Application 类应指定为 servlet 的 init-param:

现在我的问题是:Tomcat 是支持 JAX-RS 的 Servlet 容器吗?如何区分 servlet 容器 JAX-RS 感知和不感知 JAX-RS 的容器?为什么在第一种情况下可以使用扩展 javax.ws.rs.core.Application 作为 Servlet 的自定义类?

【问题讨论】:

  • AFAIK tomcat 只是一个 servlet 容器,没有开箱即用的 JAX-RS 支持。

标签: java rest tomcat web jax-rs


【解决方案1】:

“Tomcat 是支持 JAX-RS 的 Servlet 容器吗?”

没有。

“如何区分 servlet 容器 JAX-RS 感知和不感知 JAX-RS 的容器?”

它只是一个 Servlet 容器的事实应该告诉您它“支持 JAX-RS”。 JAX-RS 是 Java EE 规范的一部分。 Servlet 容器完全支持其名称所暗示的内容; Servlet 的容器。他们可能支持 JSP 等其他小功能,但不支持整个 EE 规范。这不是他们设计的一部分。如果要在 Servlet 容器中使用 JAX-RS,则需要添加一个实现,例如 JerseyResteasy

当您说 Servlet 容器时,您会想到 Jetty、Tomcat、Undertow、Grizzly 等服务器。如果您想要完整的 Java EE 支持,那么您需要获得支持整个规范的实际 Java EE 应用服务器,例如 JBoss/Wildfly、Glassfish、TomEE、WebSphere、WebLogic。

“为什么在第一种情况下可以使用扩展 javax.ws.rs.core.Application 作为 Servlet 的自定义类?”

我无法使用 Glassfish 4.0 或 Wildfly 8.1 生成工作示例,也没有在 JAX-RS specification 的任何地方指定。在 Glassfish 中,我会得到一个关于 ShoppingApplication 不是 Servlet 的异常,而在 Wildfly 中,我只会得到一个 NotFoundException,这意味着永远不会加载应用程序。

我能找到的最接近这本书的内容是将应用程序类的名称指定为&lt;servlet-name&gt;(它 JAX-RS 规范的一部分,但不是完全依赖于部署到 Java EE 服务器)

<servlet>
    <servlet-name>com.restfully.shop.services.ShoppingApplication</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>com.restfully.shop.services.ShoppingApplication</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

这是来自 JAX-RS 规范

如果存在未被现有 servlet 处理的 Application 子类,则由 ContainerInitializer 添加的 servlet 必须使用 Application 子类的完全限定名称命名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2014-10-22
    • 2012-01-17
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多