我从 JavaEE 6中 了解到,它web.xml是可选的。
web.xml
因此,如果没有 web.xml ,如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现?
就如何在没有web.xml的情况下实现应用程序配置而言,@AlexNevidomsky的回答是正确的。您@ApplicationPath在Application子类上使用注释。
@ApplicationPath
Application
@ApplicationPath("/api") public class AppConfig extends Application {}
有关部署选项的更多信息,请参见JAX-RS规范-> 2.3发布-> 2.3.2Servlet。
或更常见的是,以Jersey作为实现,我们将进行扩展ResourceConfig(extended Application)。
ResourceConfig
@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容器后,它将在jar META-INF/services文件中扫描名为的文件的文件夹javax.servlet.ServletContainerInitializer。此文件应包含的一个或多个完全限定的实现名称ServletContainerInitializer。
ServletContainerInitializer
META-INF/services
javax.servlet.ServletContainerInitializer
该接口只有一种方法
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
该Set<Class<?>会的类的列表,在装修标准@HandlesTypes上标注ServletContainerInitializer的实现。如果您看泽西岛的实施
Set<Class<?>
@HandlesTypes
@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class }) public final class JerseyServletContainerInitializer implements ServletContainerInitializer {
您应该注意到一些熟悉的注释类以及Application.class。在扫描时,所有与条件匹配的所有类都将添加到Set传递给onStartup方法中。
Application.class
Set
onStartup
如果您扫描其余的源代码,则将看到所有这些类都已完成所有注册。
Resteasy用途
@HandlesTypes({Application.class, Path.class, Provider.class}) public class ResteasyServletInitializer implements ServletContainerInitializer
我不会和别人接触。
您可以看一些资料…
JerseyServletContainerInitializer
ResteasyServletInitializer