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



