@AlexNevidomsky 写了什么他的回答是正确的,就如何在没有 web.xml 的情况下实现应用程序配置而言;你用一个@ApplicationPath上的注释Application子类。
@ApplicationPath("/api")
public class AppConfig extends Application {}
有关部署选项的更多信息,请参阅Jersey 文档:第 4 章。应用程序部署和运行时环境
或者更常见的是,以 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 容器启动时,它会扫描 jar 来查找META-INF/services
包含一个名为的文件的文件夹javax.servlet.ServletContainerInitializer
。该文件应包含一个或多个实现的完全限定名称ServletContainerInitializer
.
该接口只有一个方法
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
The Set<Class<?>
将是一个类列表,符合中的标准@HandlesTypes上的注释ServletContainerInitializer
执行。如果你看看 Jersey 的实现
@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })
public final class JerseyServletContainerInitializer
implements ServletContainerInitializer {
您应该注意到一些熟悉的注释类,以及Application.class
。扫描时,所有符合条件的类都会添加到Set
传递给onStartup
method.
如果您扫描源代码的其余部分,您将看到所有这些类都已完成所有注册。
轻松使用
@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer
我不会去打扰别人。
您可以查看一些来源...
- JerseyServletContainerInitializer源代码
- ResteasyServletInitializer源代码
- JAX-RS规格