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

时间:2015-04-19 11:39:16

标签: java web-services java-ee jax-rs

我已经从java EE6中读到了web.xml是可选的。所以没有web.xml,我如何告诉应用服务器使用Jersey作为JAX-RS规范的实现?

2 个答案:

答案 0 :(得分:11)

What @AlexNevidomsky wrote在他的回答中是正确的,至于如何在没有web.xml的情况下实现app配置;您在@ApplicationPath子类上使用Application注释。

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

有关部署选项的详细信息,请参阅JAX-RS spec -> 2.3 Publication -> 2.3.2 Servlet

或者更常见的是,使用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注释中的条件。如果你看看泽西岛的实施

@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

我不会接触别人。

您可以查看一些来源......

答案 1 :(得分:1)

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

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

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