Tomcat是否支持JAX-RS(是否具备JAX-RS意识)?

10

我们可以从《使用JAX-RS实现RESTful Java》教材中了解到:

如果我们的应用服务器支持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?为什么在第一种情况下可以使用扩展javax.ws.rs.core.Application的自定义类作为Servlet?

4
据我所知,Tomcat仅仅是一个Servlet容器,并且默认情况下不支持JAX-RS。 - Luiggi Mendoza
1个回答

14

"Tomcat是一个支持JAX-RS的Servlet容器吗?"

不是。

"如何区分支持JAX-RS的Servlet容器与不支持JAX-RS的Servlet容器?"

事实上,它只是一个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规范中也没有指定此内容。在Glassfish中,我会遇到有关ShoppingApplication不是Servlet的异常,而在Wildfly中,我只会得到一个NotFoundException,这意味着应用程序从未加载。

我能找到的与书中陈述最接近的东西是:将应用程序类的名称指定为servlet-name(这是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 子类的完全限定名命名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接