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



我已经从JavaEE6web.xml中读到了这一点。

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

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

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

有关部署选项的更多信息,请参阅Jersey文档:第4章。应用程序部署和运行时环境

或者更常见的是,使用Jersey作为实现,我们将扩展ResourceConfig(它扩展了Application)。

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

那么这是如何实现的

首先,并不是所有的JavaEE服务器都使用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<?>将是一个类列表,符合ServletContainerInitializer实现的@HandlesTypes注释中的标准。如果你看看泽西岛的实现

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

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

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

Resteasy使用

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

我不会干涉别人。

您可以查看的某些来源…

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

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

@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {
static {
//Check some system init on REST init.
Config.initCheck();
}
}

最新更新