从教科书“JAX的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提供者的servlet来处理JAX-RS调用。应用程序类应该指定为servlet的init-param:
现在我的问题是: Tomcat是一个JAX感知的Servlet容器吗?如何区分servlet容器JAX感知到的和不支持JAX的容器?为什么在第一种情况下可以使用扩展javax.ws.rs.core.Application的自定义类作为Servlet?
发布于 2015-05-12 01:33:24
“Tomcat是一个JAX感知的Servlet容器吗?”
不是的。
“如何区分servlet容器JAX感知的和不知道JAX的?”
事实上,它只是一个Servlet容器,应该告诉您它不是“JAX感知的”。JAX-RS是Java规范的一部分。Servlet容器完全支持它们的名称;Servlet容器。它们可能支持其他一些小特性,如JSP,但不支持整个EE规范。这不是他们设计的一部分。如果要在Servlet容器中使用JAX-RS,则需要添加一个实现,如泽西岛或恢复期。
当您说Servlet容器时,您会想到像Jetty、Tomcat、Under拖车、Grizzly这样的服务器。如果您想要完整的Java支持,那么您需要获得一个实际的Java应用服务器,它支持整个规范,比如JBoss、Glassfish、TomEE、WebSphere、WebLogic。
“为什么在第一种情况下可以使用您的自定义类扩展javax.ws.rs.core.Application作为Servlet?”
我无法用Glassfish 4.0或WildFail8.1生成一个工作示例,在JAX-RS规范中也没有指定这一点。在Glassfish中,我将得到一个关于ShoppingApplication不是Servlet的例外,而在Wildfly中,我只会得到一个NotFoundException,这意味着应用程序永远不会加载。
我能找到的最接近这本书描述的东西是将应用程序类的名称指定为<servlet-name> (它是JAX-RS规范的一部分,但根本不依赖于部署到Java服务器上)。
<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子类的完全限定名命名。
https://stackoverflow.com/questions/30176555
复制相似问题