Spring REST服务、Jersey REST服务和Spring+Jersey解决方案之间的区别是什么



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

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

我的目标是构建两个以JSON作为输入/输出的RESTAPI。我有jar文件作为后端处理逻辑,用于处理输入的JSON/对象并返回JSON/物体。

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

它们之间有一些值得注意的差异-您可以将Jersey资源(在Spring中称为控制器)"嵌入"在彼此之间,以启用一个单独的类来负责某个路径的子路径,而这在Spring中目前似乎不可用(您必须定义完整路径)。此外,在我看来,Jersey提供了更好的"开箱即用"错误响应(例如为什么它不能使用Jackson将JSON负载映射到Javabean),而Spring则更易于配置,但更简单,无需额外的工作。

最后,在它们之间进行选择的区别通常可以归结为——您是否已经或计划将任何其他Spring库集成到您的应用程序中?如果是这样的话,Spring REST是一种可行的方法,因为您将更容易集成它,否则它实际上只是您更喜欢使用的个人偏好。就我个人而言,我喜欢Jersey,但其他相关Spring项目(如我强烈推荐的Spring HATEOS)的强大功能使Spring成为更好的选择。我认为在你的案件中不会有真正的决定性因素。

由于您的"黄金"目标是一个简单的带有JSON输入/输出的API,因此我建议您遵循SpringREST指南。

一个主要区别是在单元测试支持方面。

Jersey测试框架不适合模拟服务器端代码——例如,如果您的REST资源依赖于一个服务,那么在测试资源方法时,您希望模拟该服务。然而,Jersey测试运行一个单独的容器,单元测试对REST资源的运行实例进行调用——目前,我还没有找到任何文档或模拟服务器端代码的方法。

相反,SpringMVC测试不需要任何容器,而且与控制器的集成更为良好。依赖注入可以用于注入模拟服务/DAO,以获得更好的单元测试。

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

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

Jersey new是每个请求的资源对象。然而,默认情况下,Spring将控制器视为默认作用域为singleton的bean。这可以用@Scope注释覆盖(尽管如果这样做,它将被Sonar标记)。

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

如果您使用Spring,则需要注意这一点。我的建议是将控制器类作为原型进行@Scope,尽管如果你进行Sonar扫描,这会给你带来警告。

最新更新