【发布时间】:2015-06-26 02:02:39
【问题描述】:
我从 JavaEE 6 中了解到web.xml 是可选的。
那么如果没有web.xml,我如何告诉应用服务器使用Jersey 作为JAX-RS 规范的实现呢?
【问题讨论】:
标签: java rest jakarta-ee jersey jax-rs
我从 JavaEE 6 中了解到web.xml 是可选的。
那么如果没有web.xml,我如何告诉应用服务器使用Jersey 作为JAX-RS 规范的实现呢?
【问题讨论】:
标签: java rest jakarta-ee jersey jax-rs
What @AlexNevidomsky wrote 在他的回答中是正确的,至于如何在没有 web.xml 的情况下实现应用程序配置;您在 Application 子类上使用 @ApplicationPath 注释。
@ApplicationPath("/api")
public class AppConfig extends Application {}
有关部署选项的更多信息,请参阅Jersey Docs: Chapter 4. Application Deployment and Runtime Environments
或者更常见的是,以 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)
Set<Class<?> 将是一个类列表,符合ServletContainerInitializer 实现上的@HandlesTypes 注释中的标准。如果你看看 Jersey 的实现
@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })
public final class JerseyServletContainerInitializer
implements ServletContainerInitializer {
您应该注意到一些熟悉的注解类,以及Application.class。所有这些符合条件的类,在扫描时,都会添加到 Set 传递给 onStartup 方法。
如果您扫描其余的源代码,您将看到所有这些类都已完成所有注册。
轻松使用
@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer
我不会接触别人。
您可以查看一些来源...
【讨论】:
implementation 'org.glassfish.jersey.containers:jersey-container-servlet:2.28' 并更改Windows 10 上的 Tomcat webapp 文件夹权限,因为 IntelliJ 无法在 Program Files 内部署。
provided 范围。 Glassfish 的库中已经有了所有的罐子。你只需要它们来编译你的应用程序。
您不必在 web.xml 中指定任何内容。定义一个激活器类:
@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {
static {
//Check some system init on REST init.
Config.initCheck();
}
}
【讨论】: