【问题标题】:What is the difference between Spring REST service, Jersey REST service and Spring+Jersey solutions?Spring REST 服务、Jersey REST 服务和 Spring+Jersey 解决方案有什么区别?
【发布时间】:2015-01-05 14:42:45
【问题描述】:

我想构建一个 RESTful 服务/API。我使用了一些像 play 这样的框架来构建它,但我想尝试其他更有效的方法。听说 Jersey 是构建 REST API 的常用库,Spring 也是一个不错的框架。但我也看到了一些解决方案,比如 Spring+Jersey。因此,我对那些 REST API 解决方案有点困惑。

谁能告诉我它们之间有什么区别? Jersey REST、Spring REST 和 Spring+Jersey REST?

我的目标是构建几个将 JSON 作为输入/输出的 REST API。我有 jar 文件作为后端处理逻辑来处理输入一个 JSON/对象并返回一个 JSON/对象。

【问题讨论】:

    标签: json spring jersey rest


    【解决方案1】:

    Jersey 是 Sun 提供的 JAX-RS API 示例实现,而 Spring REST 当然是 Spring 对相同 API/JSR 的实现。主要区别在于 Spring REST 可以轻松集成到其他 Spring API(如果您愿意),例如 Spring Data Rest

    它们之间有一些值得注意的区别 - 您可以在彼此之间“嵌入”Jersey Resources(在 Spring 中称为 Controllers),以启用一个单独的类负责某个路径的子路径,而目前在 Spring 中似乎不可用(您必须定义完整路径)。此外,在我看来,Jersey 提供了更好的“开箱即用”错误响应(例如为什么它不能使用 Jackson 将 JSON 有效负载映射到 Java bean),而 Spring 的可配置性更高,但更简单,无需额外的工作。

    最终,它们之间的选择差异通常归结为 - 您是否已经或打算将任何其他 Spring 库集成到您的应用程序中?如果是这样的话,Spring REST 是您的最佳选择,因为您可以更轻松地集成它,否则它实际上只是您更喜欢使用的个人偏好。我个人喜欢 Jersey,但其他相关 Spring 项目的强大功能(例如我强烈推荐的 Spring HATEOAS)使 Spring 成为更好的选择。我认为您的情况不会有真正的决定性因素。

    由于您的“黄金”目标是带有 JSON 输入/输出的简单 API,我建议您遵循 Spring REST guide

    【讨论】:

    • 此外,Spring+Jersey REST 通常指将 Jersey 用于 RESTful 端点,而 Spring 用于应用程序的其余部分 - 当您希望使用 Jersey 注释/实现但其他 Spring 框架(如依赖注入)时。
    • 我认为这句话可能是错误的:“Spring REST 当然是 Spring 对相同 API/JSR 的实现”。根据this other question's answer,Spring REST“不是JAX-RS实现,可以看作是JAX-RS标准的Spring替代品。”这意味着每次使用的注释存在显着且不兼容的差异。 stackoverflow.com/a/42955575/7027725
    【解决方案2】:

    一个主要区别在于单元测试支持领域。

    Jersey Test Framework 不适合模拟服务器端代码 - 例如,如果您的 REST 资源依赖于服务,您希望在测试资源方法时模拟该服务。但是,Jersey Tests 运行一个单独的容器,并且单元测试会调用正在运行的 REST 资源实例 - 目前,我还没有找到任何文档或方法来模拟服务器端代码。

    相反,Spring MVC tests 不需要任何容器 - 并且更好地与其控制器集成。依赖注入可用于注入模拟服务/DAO 以进行更好的单元测试。

    我还发现 Spring 项目的文档与 Jersey 相比更加成熟。

    【讨论】:

    【解决方案3】:

    一个细微的区别在于资源(Jersey)或控制器(Spring)对象的实例化。

    Jersey new 为每个请求提供一个资源对象。然而,默认情况下,Spring 将控制器视为具有默认单例范围的 bean。这可以用 @Scope 注释覆盖(尽管如果这样做,Sonar 会对其进行标记)。

    Spring 的这种默认行为已经多次困扰我们的应用程序。由于控制器类是单例,所有类成员实际上都是静态的。因此处理一个请求的值集仍然存在于下一个请求中。

    如果您使用 Spring,请注意这一点。我的建议是将控制器类@Scope 作为原型,即使如果您进行声纳扫描,这会给您带来警告。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2023-03-31
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多