嗨,大家好我是新来的休息和JAX-RS所以我的问题是每一个休息的服务与延伸的应用类别及定义applicationpath开始。 现在的问题是什么是应用类本身的lifecyce? 下面是一个例子:
import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends Application {}
这是一个servlet? 它是永远活着吗? 我应如何理解这一类? 它是一个CDI豆? 服务器是否在每次请求创建这个类?
什么是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
类。 相比Application
, ResourceConfig
提供高级功能,简化JAX-RS组分,如在一组包名等详情的在提供类路径扫描根资源和提供者类或登记,请参阅泽西文档 。
与多个工作Application
子
还值得一提的是,你是不是仅限于一个单一的Application
每个Web应用程序的子类。 同一场战争可以有多个Application
的子类。 有关详细信息,看看这个职位从亚当边 :
要部署在一个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"; } }
@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/first
和http://localhost:8080/multiple-roots/two/second
如果没有什么Application
子类是存在?
如果没有Application
子类是目前,JAX-RS实现都必须添加一个servlet,并设置它的名字javax.ws.rs.Application
和自动发现必须与应用程序打包所有资源类和供应商。
欲知详情,看看在的第2章JAX-RS 2.1规范 。