一尘不染

如何在没有web.xml的情况下将Jersey用作JAX-RS实现?

java

我从 JavaEE 6中 了解到,它web.xml是可选的。

因此,如果没有 web.xml ,如何告诉应用程序服务器使用Jersey作为JAX-RS规范的实现?


阅读 307

收藏
2020-09-08

共1个答案

一尘不染

就如何在没有web.xml的情况下实现应用程序配置而言,@AlexNevidomsky的回答是正确的。您@ApplicationPathApplication子类上使用注释。

@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

我不会和别人接触。

您可以看一些资料…

2020-09-08