What is Application
?
Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html是 JAX-RS 提供的与部署无关的抽象类,用于配置和注册 JAX-RS 应用程序的组件,它还用于向应用程序提供附加元数据。
Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html是可以使用注入的类型之一@Context https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Context.html注解。欲了解更多详细信息,请参阅此answer https://stackoverflow.com/a/35868654/1426227.
的子类Application
Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html子类可以实现诸如getClasses() https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html#getClasses--, getSingletons() https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html#getSingletons-- and getProperties() https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html#getProperties--用于配置和注册组件和属性。
Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html子类可以注释为@ApplicationPath https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/ApplicationPath.html,定义 JAX-RS 资源类的基本 URI(用注释的类)@Path https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/Path.html). Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html子类在 Web 应用程序启动时实例化一次,并由 JAX-RS 运行时管理。
最简单的实现如下:
@ApplicationPath("api")
public SampleApplication extends Application {
}
在上面的示例中,没有注册资源类或提供程序,因此 JAX-RS 运行时将扫描 JAX-RS 组件的类路径并自动注册它们。
然而,根据这个雅库布·波德萨克 (Jakub Podlesak) 的帖子 https://blogs.oracle.com/japod/entry/when_to_use_jax_rs,在生产环境中不鼓励使用这种方法:
上面的例子效果很好。启动时,应用程序仅扫描实际的类路径,并将其中找到的每个 JAX-RS 组件类添加到实际的运行时配置中。不是很棒吗?坦白说,这种配置可以很好地工作。直到有人更改系统配置(系统类路径)或应用程序的打包方式(然后可以从应用程序类路径添加/删除新的第 3 方组件)。这些更改可能超出您的控制范围,如果其中之一发生,您的应用程序配置可能会中断。因此,在生产环境中使用这种配置并不明智。
Jersey,JAX-RS 参考实现,提供了ResourceConfig https://jersey.github.io/apidocs/latest/jersey/org/glassfish/jersey/server/ResourceConfig.html班级。相比Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html, ResourceConfig https://jersey.github.io/apidocs/latest/jersey/org/glassfish/jersey/server/ResourceConfig.html提供高级功能来简化 JAX-RS 组件的注册,例如扫描提供的类路径或一组包名称中的根资源和提供程序类等。有关更多详细信息,请参阅泽西岛文档 https://jersey.github.io/documentation/latest/deployment.html#environmenmt.appmodel.
与多个合作Application
子类
还值得一提的是,你并不局限于单一Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html每个 Web 应用程序的子类。同一个WAR可以有多个Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html子类。欲了解更多详细信息,请查看此亚当·比恩的帖子 http://www.adam-bien.com/roller/abien/entry/multiple_jax_rs_uris_in:
要在一个 WAR 中部署具有不同 URI 的多个 JAX-RS 应用程序,您必须创建一个javax.ws.rs.core.Application
每个此类应用程序的子类(或使用web.xml
以此目的)。显然,Java EE 中无处不在的配置约定(或异常配置)不再起作用:您必须通过重写方法来显式配置每个子类中的资源getClasses
or 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
and http://localhost:8080/multiple-roots/two/second
如果没有怎么办Application
子类存在吗?
If no Application https://javaee.github.io/javaee-spec/javadocs/javax/ws/rs/core/Application.html子类存在,JAX-RS 实现需要添加一个 servlet 并将其名称设置为javax.ws.rs.Application
并自动发现必须与应用程序打包的所有资源类和提供程序。
欲了解更多详情,请参阅第 2 章JAX-RS 2.1 规范 http://download.oracle.com/otn-pub/jcp/jaxrs-2_1-final-eval-spec/jaxrs-2_1-final-spec.pdf.