我已经从JavaEE6web.xml
中读到了这一点。
因此,如果没有web.xml,我如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现?
@AlexNevidomsky在他的回答中所写的是正确的,就如何在没有web.xml的情况下实现应用程序配置而言;在Application
子类上使用@ApplicationPath
注释。
@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");
}
}
那么这是如何实现的
首先,并不是所有的JavaEE服务器都使用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<?>
将是一个类列表,符合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();
}
}