我已经从java EE6中读到了web.xml是可选的。所以没有web.xml,我如何告诉应用服务器使用Jersey作为JAX-RS规范的实现?
答案 0 :(得分:11)
What @AlexNevidomsky wrote在他的回答中是正确的,至于如何在没有web.xml的情况下实现app配置;您在@ApplicationPath
子类上使用Application
注释。
@ApplicationPath("/api")
public class AppConfig extends Application {}
有关部署选项的详细信息,请参阅JAX-RS spec -> 2.3 Publication -> 2.3.2 Servlet
或者更常见的是,使用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容器时,它会扫描jars,查找名为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
。扫描时,所有符合条件的类都会添加到Set
传递给onStartup
方法。
如果您扫描其余的源代码,您将看到所有这些类的注册都已完成。
Resteasy使用
@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer
我不会接触别人。
您可以查看一些来源......
答案 1 :(得分:1)
您不必在web.xml中指定任何内容。定义激活类:
@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {
static {
//Check some system init on REST init.
Config.initCheck();
}
}