jax-rs之Servlet 3.0 和 JAX-RS

jillzhang 阅读:50 2024-04-17 11:32:04 评论:0

我发现这个问题的答案相互矛盾,而且我未能成功运行示例。

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

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

Because this example deploys within a Java EE application server or standalone Servlet 3.x container, all we need is an empty web.xml file. The server will detect that an Application class is within your WAR and automatically deploy it. (RESTful Java with JAX-RS 2.0, 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 条目。

请您参考如下方法:

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

  • Servlet 组件(即 servlet 和过滤器)的程序化注册。您可以进行 Google 搜索,您应该会找到一些示例。

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

    Jersey 在 JerseyServletContainerInitializer 中有这样一个 SevletContainerInitializer 的实现.此类位于 jersey-container-servlet jar 中。所以你需要这个 jar 才能工作。如果你看this method ,在这里您将看到 ServletContainer 的编程注册(与您在 web.xml 中声明的相同

但这还不是全部。我们仍然需要某种方式来配置我们的应用程序,至少声明 servlet 映射。那就是 Application 的地方类和 @ApplicationPath注释进来。我们将扩展 Application 类并注释 @ApplicationPath("/path") 其中 "path" 是相同的作为 web.xml 中的 servlet 映射

@ApplicationPath("/api") 
public class MyApplication extends Application {} 

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

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

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

还应注意,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> 

这将拉入一堆其他的 jar。你没有使用 Maven,那么你可以下载所有的 jar here (the JAX-RS 2.0 RI bundle) ,并将所有这些放入您的应用程序中。

另请参阅:


标签:Servlet
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号