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

How to use Jersey as JAX-RS implementation without web.xml?

我从 JavaEE 6 读到 web.xml 是可选的。

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

您不必在 web.xml 中指定任何内容。定义一个激活器 class:

@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {

  static {
      //Check some system init on REST init.
      Config.initCheck();
  }
}

in his answer is correct, as far as how to implement the app configuration with no web.xml; you use an @ApplicationPath annotation on an Application 子类。

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

有关部署选项的详细信息,请参阅 Jersey Docs: Chapter 4. Application Deployment and Runtime Environments

或者更常见的是,使用 Jersey 作为实现,我们将扩展 ResourceConfig(扩展 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 容器启动时,它会扫描 jars 以查找 META-INF/services 文件夹和名为 javax.servlet.ServletContainerInitializer 的文件。此文件应包含一个或多个 ServletContainerInitializer.

实现的完全限定名称

这个接口只有一个方法

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

Set<Class<?> 将是 类 的列表,符合 ServletContainerInitializer 实施的 @HandlesTypes 注释中的标准。如果你看看 Jersey 的实现

@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

我不会和别人扯上关系。

你可以看看一些来源...