Servlet 3.0和JAX-RS

Lee*_*rth 2 jax-rs

我发现这个问题的答案相互矛盾,但我没能成功运行一个例子.

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

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

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

为了澄清什么,我也不需要.我曾成功地使用一个web.xml实现JAX-RS在Tomcat的7新泽西州的帮助,所以,我并不需要怎么做任何解释.另外,我完全清楚其他Java EE/Servlet容器(TomEE,Glassfish,Jersey,Websphere等等)都是开箱即用的JAX-RS.我只需要知道我是否正在追逐我的尾巴试图让Tomcat 7(Servlet 3.0)与JAX-RS一起工作而不添加Servlet容器和没有web.xml条目.

Pau*_*tha 5

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

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

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

    泽西岛的这种实现SevletContainerInitializerJerseyServletContainerInitializer.这个类位于jersey-container-servletjar中.所以你需要这个罐才能工作.如果你看一下这个方法,你可以在这里看到程序注册ServletContainer(你将在web.xml中声明的那个)

但那还不是全部.我们仍然需要一些配置应用程序的方法,至少要声明servlet映射.这就是Application类和@ApplicationPath注释的用武之地.我们将扩展Application类并注释@ApplicationPath("/path")where "path"与web.xml中的servlet映射相同

@ApplicationPath("/api")
public class MyApplication extends Application {}
Run Code Online (Sandbox Code Playgroud)

这是标准的JAX-RS.通常使用Jersey而不是Application类,我们使用一个ResourceConfig类(它是一个子类Application)

@ApplicationPath("/api")
public class MyApplication extends ResourceConfig {
    public MyApplication() {
        packages("package.to.scan");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果你使用的是Maven,那么你需要的主要依赖是这个

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey2.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这将拉出一堆其他的罐子.你没有使用Maven,那么你可以在这里下载所有的罐子(JAX-RS 2.0 RI包),并将所有这些放入你的应用程序中.

也可以看看:

  • 您将需要Maven来运行示例.如果不知道Maven,那么你将无法运行这些示例.所有依赖项都是`pom.xml`文件.当你使用Maven构建项目时,Maven会拉入所有的jar.我正在查看示例项目,是的,他们确实将RESTeasy作为依赖项包含在pom.xml文件中.这就是示例正在使用的JAX-RS实现 (2认同)