当前位置: 首页 > 面试题库 >

如何在没有web.xml的情况下将Jersey用作JAX-RS实现?

吕霍英
2023-03-14
问题内容

我从 JavaEE 6中 了解到,它web.xml是可选的。

因此,如果没有 web.xml ,如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现?


问题答案:

就如何在没有web.xml的情况下实现应用程序配置而言,@AlexNevidomsky的回答是正确的。您@ApplicationPathApplication子类上使用注释。

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

有关部署选项的更多信息,请参见JAX-RS规范-> 2.3发布-> 2.3.2Servlet。

或更常见的是,以Jersey作为实现,我们将进行扩展ResourceConfig(extended Application)。

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

那么这是如何实现的…

首先,并不是所有的Java
EE服务器都使用Jersey。实际上,我唯一知道使用Jersey的是Glassfish和WebLogic。JBoss使用Resteasy。Tom
EE使用CXF。WebSphere使用Apache Wink。这些是我唯一想到的。

所以我想这个问题是“服务器如何知道如何加载JAX-RS应用程序?”

Servlet
3.0引入了可插拔机制,该机制使用ServletContainerInitializer。工作原理是,启动Server/ Servlet容器后,它将在jar META-INF/services文件中扫描名为的文件的文件夹javax.servlet.ServletContainerInitializer。此文件应包含的一个或多个完全限定的实现名称ServletContainerInitializer

接口只有一种方法

void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)

Set<Class<?>会的类的列表,在装修标准@HandlesTypes上标注ServletContainerInitializer的实现。如果您看泽西岛的实施

@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })
public final class JerseyServletContainerInitializer 
                   implements ServletContainerInitializer {

您应该注意到一些熟悉的注释类以及Application.class。在扫描时,所有与条件匹配的所有类都将添加到Set传递给onStartup方法中。

如果您扫描其余的源代码,则将看到所有这些类都已完成所有注册。

Resteasy用途

@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer

我不会和别人接触。

您可以看一些资料…

  • JerseyServletContainerInitializer 源代码
  • ResteasyServletInitializer 源代码
  • JAX-RS规格


 类似资料:
  • 我从JavaEE 6中读到了这一点。 所以如果没有web.xml,我如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现呢?

  • TL;DR:将@webservlet(“/find-customers”)放在servlet(通过Tomcat 7部署)的开头并不是将servlet映射到host:port/webproject/find-customers中,即使servlet位于src文件夹中。

  • 问题内容: 我想知道如何在Spring MVC上引导我的应用程序? 我有一个初始化器: 我知道我们为什么需要以及如何使用它来引导应用程序。但是我不明白,如果没有文件(只有),怎么知道应该使用哪个servlet来引导应用程序? 依存关系 我在Spring核心中找到了此类。使用它来引导我的应用程序是否正确? http://docs.oracle.com/javaee/7/api/javax/servl

  • 我知道关于这个问题有很多答案,但我仍然不清楚JAX-RS API(规范)和Jersey框架(参考实现)之间的区别。 我读到: Jersey框架基本上使用com.sun.Jersey.spi.container.servlet.ServletContainer servlet拦截所有传入的请求。正如我们在项目web.xml中配置的那样,所有传入的rest请求都应该由该servlet处理。有一个ini

  • 我知道这可以在Servlet3.0中通过@Webservlet注释实现,在这里您只需分配url模式,而不必在web.xml中进行任何配置。是否有一种方法可以通过编程方式为运行Servlet2.5的应用程序分配servlets url模式? 我正在创建一个库,多个应用程序将依赖于它,并试图使它,以便这些应用程序中的每一个都不必显式配置任何servlet url映射,我正在创建的库中的servlet在