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

时间:2017-02-06 21:37:30

标签: java rest java-ee jax-rs

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

ValueSerializer

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

1 个答案:

答案 0 :(得分:11)

什么是Application

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

Application是可以使用@Context注释注入的类型之一。有关详细信息,请参阅此answer

Application

的子类

Application子类可以实现getClasses()getSingletons()getProperties()等方法来配置和注册组件和属性。

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

最简单的实现如下:

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

}

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

但是,根据这个post from Jakub Podlesak,在生产环境中不鼓励采用这种方法:

  

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

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

使用多个Application子类

还值得一提的是,您不限于每个Web应用程序的单个Application子类。同一个WAR可以有多个Application子类。有关详细信息,请查看此post from Adam Bien

  

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

     
@Path("first")
public class FirstResource {

    @GET
    public String first() {
        return "first";
    }
}
     
@ApplicationPath("one")
public class JAXRSConfigurationOne extends Application {

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

    @GET
    public String first() {
        return "second";
    }
}
     
@ApplicationPath("two")
public class JAXRSConfigurationTwo extends Application {

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

两个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 specification的第2章。