Rest 服务的 Application 类生命周期是什么?

2024-02-28

每个休息服务都是从扩展应用程序类并定义应用程序路径开始的吗?该应用程序类本身的生命周期是什么?这是一个例子:

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

这是一个servlet吗?它永远活着吗?我该如何理解这门课呢?它是 cdi 豆吗?服务器是否会在每次请求时创建此类?


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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rest 服务的 Application 类生命周期是什么? 的相关文章

  • 创建通用数组时出错

    public class TwoBridge implements Piece private HashSet
  • Java中如何对对象数组进行排序?

    我的数组不包含任何字符串 但它包含对象引用 每个对象引用都通过 toString 方法返回名称 id 作者和发布者 public String toString return name n id n author n publisher n
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • Android Studio:如果设置项目的背景颜色,ListView OnClick 动画将不起作用

    在我的项目中 我在 ListView 内设置了项目 由插入 ConstraintLayout 中的多个元素组成 的背景颜色 但如果背景颜色不是至少一点透明 则单击和长按的默认动画会消失 事实上 随着透明度的降低 点击元素的效果越来越不明显
  • 参考接口创建对象

    引用变量可以声明为类类型或接口类型 如果变量声明为接口类型 则它可以引用实现该接口的任何类的任何对象 根据上面的说法我做了一个理解上的代码 正如上面所说声明为接口类型 它可以引用实现该接口的任何类的任何对象 但在我的代码中显示display
  • 使用 Microsoft REST API - Java 将 Xbox-Live GamerTag 转换为 XUID

    我有一个 Java 应用程序 它需要能够获取用户输入的 Minecraft Bedrock Edition 玩家标签 并将其转换为给定帐户的 XUID 以便我可以将其存储起来以供稍后列入白名单和参考目的 我一直在浏览 Microsoft R
  • 在 Java 中生成 LaTeX 输出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有用于从 Java 生成 LaTeX 输出的 Java 库 渲染乳胶 JLatex数学 https
  • Netty Nio java 中的通信

    我想在 Netty nio 中创建一个具有两个客户端和一个服务器的通信系统 更具体地说 首先 我希望当两个客户端与服务器连接时从服务器发送消息 然后能够在两个客户端之间交换数据 我正在使用本示例提供的代码 https github com
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • java charAt() 和startsWith() 哪个更快? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题是 如果我想检查特定索引中字符串的一个字符 仅检查一个字符 哪种方法非常有效charAt or startsWith 我的意思是 据我所
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • 为什么从类构造函数调用的方法应该是最终的? [复制]

    这个问题在这里已经有答案了 我是一名 Java 新手 我试图理解 Oracle 网站教程中的以下行 https docs oracle com javase tutorial java IandI final html https docs
  • 莫基托。验证方法参数是特定类

    我有一个方法 void putObject
  • Java 执行器和长寿命线程

    我继承了一些使用 Executors newFixedThreadPool 4 的代码运行 4 个长寿命线程来完成应用程序的所有工作 这是推荐的吗 我读过Java 并发实践 https rads stackoverflow com amzn
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • 隐藏 JTable 临时列

    我正在使用 JTable 显示数据库中的数据 现在我想通过 Jcombobox 过滤我的 jtable 我正在使用 Jcombo 框 其中包含 030 024 045 等值 这些值已在 jtable 中设置为列标题 当我单击组合时 选定的列
  • Spring Data MongoDB 和批量更新

    我正在使用 Spring Data MongoDB 并且想要执行批量更新 就像此处描述的那样 http docs mongodb org manual reference method Bulk find update Bulk find
  • Bipush 在 JVM 中如何工作?

    我知道 iload 接受整数 1 到 5 但是如何使用 bipush 指令扩展到更高的数字 特定整数如何与字节码一起存储 有几种不同的指令可用于推送整数常量 最小的是iconst 指令 这些只是一个字节 因为该值是在操作码本身中编码的 ic
  • Alfresco 和 Nuxeo 哪个更容易扩展? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在考虑做一个rewrite http kato agency blogspot com 2009 12 kato redesign html
  • RetentionPolicy CLASS 与 RUNTIME

    两者之间有什么实际区别RetentionPolicy CLASS and RetentionPolicy RUNTIME 看起来两者都被记录到字节码中 并且无论如何都可以在运行时访问 无论如何 两者都可以在运行时访问 那不是那个javado

随机推荐