Servlet 3.0和JAX-RS

时间:2015-10-22 17:18:02

标签: jax-rs

我发现这个问题的答案存在矛盾,但我未能成功运行一个例子。

JAX-RS是否可以使用带注释的Servlet 3.0(特别是Tomcat 7)实现,而无需实现另一个Servlet容器?

如果不是,请解释为什么本书中的以下引用不正确,或者我解释错误。

  

因为此示例在Java EE应用程序服务器或部署中部署   独立的Servlet 3.x容器,我们只需要一个空的web.xml   文件。服务器将检测到您的应用程序类   WAR并自动部署它。 (使用JAX-RS 2.0的RESTful Java,Bill Burke)

澄清我需要帮助的内容...我已经成功地使用web.xml在Tomcat 7中使用Jersey实现了JAX-RS,因此,我不需要任何解释如何这样做。另外,我完全清楚其他Java EE / Servlet容器(TomEE,Glassfish,Jersey,Websphere等等)都是开箱即用的JAX-RS。我只需要知道我是否在追逐我的尾巴试图让Tomcat 7(Servlet 3.0)与JAX-RS协同工作而不添加Servlet容器和没有web.xml条目。

1 个答案:

答案 0 :(得分:5)

在Servlet环境中,Jersey作为servlet或servlet过滤器运行。没办法解决这个问题。那么如果不在web.xml中声明它,它是如何工作的呢?此功能的两个主要组件

  • Servlet组件(即servlet和fitler)的编程注册。你可以进行谷歌搜索,你应该找到一些例子。

  • Servlet 3.x中引入的Servlet可插拔性。它是如何工作的是您实现ServletContainerInitializer,在名为javax.servlet.ServletContainerInitializer的文件中列出该实现,并将该文件放在jar的META-INF/services目录中。 servlet容器应该扫描查找此文件的jar。当它找到时,它会看到实现,找到实现,实例化它,然后调用它onStartup方法。

    泽西岛在JerseyServletContainerInitializer中实现了SevletContainerInitializer。该类位于jersey-container-servlet jar中。所以你需要这个罐才能工作。如果您查看this method,您可以在此处看到ServletContainer的编程注册(与您在web.xml中声明的相同的注册

但并非全部。我们仍然需要一些配置应用程序的方法,至少要声明servlet映射。这就是Application类和@ApplicationPath注释的位置。我们会扩展Application类并注释@ApplicationPath("/path") "path"所在的位置@ApplicationPath("/api") public class MyApplication extends Application {} 与web.xml中的servlet映射相同

Application

这是标准的JAX-RS。使用Jersey而不是ResourceConfig类,我们使用Application类(@ApplicationPath("/api") public class MyApplication extends ResourceConfig { public MyApplication() { packages("package.to.scan"); } } 的子类)

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey2.version}</version>
</dependency>

您可以在Servlet 3.x环境中看到有关Jersey部署选项的更多信息,here

还应该注意,Java EE服务器具有JAX-RS实现,因此我们只需要将javaee-api jar添加到我们的应用程序中作为提供的依赖项。但是在servlet容器中,我们需要提供自己的实现,Jersey就是这样的实现。

如果您使用的是Maven,那么您需要的主要依赖是

solr start

这会吸引其他一些罐子。你没有使用Maven,那么你可以下载所有的罐子here (the JAX-RS 2.0 RI bundle),并将所有这些放入你的应用程序。

另见: