如何使用Jersey作为没有web.xml的JAX-RS实现?

Des*_*PRG 3 java web-services jax-rs java-ee

我已经读过java EE6中的web.xml是可选的.所以没有web.xml,我如何告诉应用服务器使用Jersey作为JAX-RS规范的实现?

Pau*_*tha 13

@AlexNevidomsky在他的回答中所写的内容是正确的,至于如何在没有web.xml的情况下实现app配置; 您@ApplicationPathApplication子类上使用注释.

@ApplicationPath("/api")
public class AppConfig extends Application {}
Run Code Online (Sandbox Code Playgroud)

有关部署选项的更多信息,请参阅JAX-RS规范 - > 2.3发布 - > 2.3.2 Servlet

或者更常见的是,使用Jersey作为实现,我们将扩展ResourceConfig(扩展Application).

@ApplicationPath("api")
public class AppConfig extends ResourceConfig {
    public AppConfig() {
        packages("package.to.scan");
    }
}
Run Code Online (Sandbox Code Playgroud)

那么这是如何实现的......

首先,并非所有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)
Run Code Online (Sandbox Code Playgroud)

Set<Class<?>会的类的列表,在装修标准@HandlesTypes上标注ServletContainerInitializer的实现.如果你看看泽西岛的实施

@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })
public final class JerseyServletContainerInitializer 
                   implements ServletContainerInitializer {
Run Code Online (Sandbox Code Playgroud)

你应该注意到一些熟悉的注释类,以及Application.class.在扫描时,所有这些符合条件的类都被添加到Set传递给onStartup方法中.

如果您扫描其余的源代码,您将看到所有这些类的注册都已完成.

Resteasy使用

@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer
Run Code Online (Sandbox Code Playgroud)

我不会接触别人.

你可以看一些来源......