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

我已经阅读,从Java EE6 web.xml是可选的。 因此,如果没有web.xml,我怎么能告诉应用服务器使用Jersey作为JAX-RS规范的实现?

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

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

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

那么这是如何实施的…

首先,不是所有的Java EE服务器都使用Jersey。 其实我唯一知道使用泽西的是Glassfish和WebLogic。 JBoss使用Resteasy。 汤姆EE使用CXF。 WebSphere使用Apache Wink。 那些是我能想到的唯一的。

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

Servlet 3.0引入了可插入性机制,它使用了ServletContainerInitializer 。 它是如何工作的,当Server / Servlet容器启动时,它会用名为javax.servlet.ServletContainerInitializer的文件扫描jar的META-INF/services文件夹。 该文件应该包含一个或多个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(); } }