从教材《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 容器吗?如何区分支持 JAX-RS 的 servlet 容器和不支持 JAX-RS 的 servlet 容器?为什么在第一种情况下可以使用扩展的自定义类javax.ws.rs.core.Application
作为 Servlet?
“Tomcat 是一个支持 JAX-RS 的 Servlet 容器吗?”
No.
“如何区分支持 JAXRS 的 servlet 容器和不支持 JAX-RS 的 servlet 容器?”
事实上,这只是一个 Servlet 容器,应该告诉您它是not“JAX-RS 感知”。 JAX-RS 是 Java EE 规范的一部分。 Servlet 容器完全支持其名称所暗示的功能; Servlet 的容器。他们可能支持其他小功能,例如 JSP,但不会支持整个 EE 规范。这不是他们设计的一部分。如果你想在Servlet容器中使用JAX-RS,你需要添加一个实现,比如Jersey https://eclipse-ee4j.github.io/jersey/ or Resteasy https://resteasy.github.io
当您提到 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规范 https://jsr311.java.net/nonav/releases/1.1/spec/spec.html。在 Glassfish 中,我会得到一个例外ShoppingApplication
不是 Servlet,在 Wildfly 中我只会得到一个NotFoundException
,这意味着应用程序从未加载。
我能找到的最接近书中所述的内容是将应用程序类的名称指定为<servlet-name>
(which isJAX-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 规范
If an Application
存在未被现有 servlet 处理的子类,则由该 servlet 添加的 servletContainerInitializer
必须以完全限定名称命名Application
子类。
- Read JAX-RS 规范 - 发布 - 2.3.2 Servlet https://jsr311.java.net/nonav/releases/1.1/spec/spec.html有关标准 JAX-RS 部署选项的完整规范。任何其他未指定的部署/配置选项都是特定于实现的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)