如何在没有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(); } }