什么是REST服务的是应用类的生命周期?什么是REST服务的是应用类的生命周期?(What is t

2019-05-11 20:17发布

嗨,大家好我是新来的休息和JAX-RS所以我的问题是每一个休息的服务与延伸的应用类别及定义applicationpath开始。 现在的问题是什么是应用类本身的lifecyce? 下面是一个例子:

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

这是一个servlet? 它是永远活着吗? 我应如何理解这一类? 它是一个CDI豆? 服务器是否在每次请求创建这个类?

Answer 1:

什么是Application

Application是用于配置和注册JAX-RS应用程序的组件由JAX-RS提供部署不可知抽象类和它也用于提供额外的元数据到应用程序。

Application是可以通过注射的类型之一@Context注解。 有关详细信息,请参阅此答案 。

的子类Application

Application子类可以实现的方法,例如getClasses() getSingletons()getProperties()用于配置和注册的组件和特性。

Application的子类可以与注释@ApplicationPath ,限定用于JAX-RS资源类(带有加注解的类的基URI @Path )。 Application子类instantied一旦Web应用程序启动时,他们被JAX-RS运行时管理。

可能最简单的实现是如下:

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

}

另外,在上述无资源类或提供商的例子中注册,所以JAX-RS运行时将扫描JAX-RS部件类路径,并且将它们自动注册。

然而,根据该职位由的Jakub Podlesak ,这种方法在生产环境泄气:

上面的例子的伟大工程。 启动时,应用程序只是扫描实际的类路径,并增加了在那里发现实际运行时配置每一个JAX-RS组件类。 是不是很大? 坦率地说,这种配置可能会工作得很好。 直到有人改变或者系统配置(系统类路径)或如何应用程序被打包的方式(一个新的第三方组件可以添加/从应用程序类路径中删除即可)。 这些变化可能是在你的控制,如果他们中的一个发生,你的应用程序配置可能会断裂。 出于这个原因,它是不明智的使用这种配置在生产环境中。

新泽西州的JAX-RS参考实现,提供了ResourceConfig类。 相比ApplicationResourceConfig提供高级功能,简化JAX-RS组分,如在一组包名等详情的在提供类路径扫描根资源和提供者类或登记,请参阅泽西文档 。

与多个工作Application

还值得一提的是,你是不是仅限于一个单一的Application每个Web应用程序的子类。 同一场战争可以有多个Application的子类。 有关详细信息,看看这个职位从亚当边 :

要部署在一个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和自动发现必须与应用程序打包所有资源类和供应商。

欲知详情,看看在的第2章JAX-RS 2.1规范 。



文章来源: What is that Application class lifecycle of a rest service?