Spring REST服务、Jersey REST服务和Spring+Jersey解决方案有什么区别?

59
我想构建一个RESTful服务/接口。之前用了一些框架例如play来建立它,但我想尝试其他更有效率的方法。我听说Jersey是一个常用的构建REST API的库,Spring也是一个不错的框架。但我也看到一些解决方案,例如Spring+Jersey。因此,我对这些REST API解决方案有点困惑。
有人能告诉我这些的区别吗?Jersey REST、Spring REST和Spring+Jersey REST?
我的目标是构建几个以JSON作为输入/输出的REST API。我有一个jar文件作为后端处理逻辑,用于处理输入的JSON/object并返回JSON/object。
3个回答

52

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

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

最终选择它们之间的差异通常归结为 - 您是否已经或计划将任何其他Spring库集成到您的应用程序中?如果是,那么Spring REST是正确的选择,因为您将更容易地将其集成,否则只是个人偏好,您可以选择想要使用的那个。个人喜欢Jersey,但其他相关的Spring项目(例如Spring HATEOAS,我强烈推荐)的强大功能使Spring成为更好的选择。我认为在您的情况下不会有真正的决定因素。

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


1
通常情况下,Spring+Jersey REST指的是在RESTful端点中使用Jersey,而在应用程序的其余部分中使用Spring。这种方法可以让您使用Jersey注释/实现,同时可以使用其他Spring框架,例如依赖注入。 - Ross Taylor-Turner
我认为这句话可能是错误的:“Spring REST当然是Spring对相同API/JSR的实现”。根据这个问题的答案,Spring REST“不是JAX-RS的实现,可以看作是JAX-RS标准的Spring替代品。”这意味着它们使用的注释存在重大且不兼容的差异。 https://dev59.com/NVgQ5IYBdhLWcg3wUiZS#42955575 - PeteH32

10

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

Jersey测试框架不适合用来模拟服务器端代码 - 例如,如果您的REST资源依赖于某个服务,您希望在测试资源方法时模拟该服务。然而,Jersey测试运行在单独的容器中,而单元测试则会调用正在运行的REST资源实例 - 目前为止,我尚未找到任何文档或方法可以模拟服务器端代码。

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

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


请看这里 -> https://dev59.com/UV4c5IYBdhLWcg3w3tkv#32009541 查看如何模拟服务器端代码。 - Lars Juel Jensen

0

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

Jersey为每个请求新建一个资源对象。而默认情况下,Spring将控制器视为具有单例默认范围的bean。这可以通过@Scope注释覆盖(尽管如果您这样做,它会被Sonar标记)。

Spring的这种默认行为已经多次影响了我们的应用程序。由于控制器类是单例的,所有类成员都是有效的静态成员。因此,处理一个请求设置的值仍然会保留到下一个请求。

如果您使用Spring,请注意这一点。我的建议是将控制器类@Scope为prototype,即使这样做会在Sonar扫描中获得警告。


2
不行。这是不好的实践。Servlets或Controllers应该是单例的。它们只应该作为业务/数据访问层的中间件。它们只应该解码来自UI的数据并将其传递下去。保持它们无状态。 - Vineet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接