什么是休息服务的应用程序类生命周期?

Joe*_*oey 2 java rest jax-rs java-ee

大家好我是新来的休息和jax-rs所以我的问题是每个休息服务开始扩展该应用程序类和定义应用程序路径.现在我的问题是该应用程序类本身的生命周期是什么?这是一个例子:

import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends Application {}
Run Code Online (Sandbox Code Playgroud)

这是一个servlet吗?它总是活着吗?我怎么理解这堂课?它是一个cdi豆?服务器是否在每个请求上创建此类?

cas*_*lin 12

什么是Application

Application 是JAX-RS提供的用于配置和注册JAX-RS应用程序组件的部署无关抽象类,它还用于向应用程序提供其他元数据.

Application是可以使用@Context注释注入的类型之一.有关更多详细信息,请参阅此答案.

的子类 Application

Application子类可以实现诸如getClasses(),getSingletons()以及getProperties()配置和注册组件和属性的方法.

Application子类可以使用注释@ApplicationPath,定义JAX-RS资源类的基本URI(带注释的类@Path).Application当Web应用程序启动时,子类会立即执行一次,并且它们由JAX-RS运行时管理.

最简单的实现如下:

@ApplicationPath("api")
public SampleApplication extends Application {

}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,没有注册资源类或提供程序,因此JAX-RS运行时将扫描JAX-RS组件的类路径并自动注册它们.

但是,根据Jakub Podlesak的这篇文章,在生产环境中不鼓励采用这种方法:

以上示例效果很好.启动时,应用程序只扫描实际的类路径,并将在那里找到的每个JAX-RS组件类添加到实际的运行时配置中.不是很棒吗?坦率地说,这种配置可以正常工作.在某人更改系统配置(系统类路径)或应用程序打包方式之前(可以在应用程序类路径中添加/删除新的第三方组件).这些更改可能超出您的控制范围,如果其中一个发生,您的应用程序配置可能会中断.因此,在生产环境中使用这种配置是不明智的.

Jersey,JAX-RS参考实现,提供了ResourceConfig类.与之相比Application,ResourceConfig提供了简化JAX-RS组件注册的高级功能,例如在提供的类路径或一组包名称中扫描根资源和提供程序类等.有关更多详细信息,请参阅Jersey文档.

使用多个Application子类

还值得一提的是,您不限于Application每个Web应用程序的单个子类.同一个WAR可以有多Application个子类.有关更多详细信息,请查看Adam Bien的这篇文章:

要在一个WAR中部署具有不同URI的多个JAX-RS应用程序,您必须为javax.ws.rs.core.Application每个此类应用程序创建一个子类(或web.xml用于此目的).显然,Java EE中无处不在的约定优于配置(或异常配置)不再适用:您必须通过重写方法显式配置每个子类中的资源,getClasses或者getSingletons:

@Path("first")
public class FirstResource {

    @GET
    public String first() {
        return "first";
    }
}
Run Code Online (Sandbox Code Playgroud)
@ApplicationPath("one")
public class JAXRSConfigurationOne extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<>();
        resources.add(FirstResource.class);
        return resources;
    }
}
Run Code Online (Sandbox Code Playgroud)
@Path("second")
public class SecondResource {

    @GET
    public String first() {
        return "second";
    }
}
Run Code Online (Sandbox Code Playgroud)
@ApplicationPath("two")
public class JAXRSConfigurationTwo extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new HashSet<>();
        resources.add(SecondResource.class);
        return resources;
    }
}
Run Code Online (Sandbox Code Playgroud)

两个JAX-RS应用程序都可以通过不同的URI访问:http://localhost:8080/multiple-roots/one/firsthttp://localhost:8080/multiple-roots/two/second

如果没有Application子类怎么办?

如果不存在Application子类,则需要JAX-RS实现添加servlet并将其名称设置为javax.ws.rs.Application并自动发现必须与应用程序打包在一起的所有资源类和提供程序.

有关更多详细信息,请查看JAX-RS 2.1规范的第2章.