我发现这个问题的答案存在矛盾,但我未能成功运行一个例子。
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条目。
答案 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),并将所有这些放入你的应用程序。
另见: