Spring Rest服务和Jersey Rest服务以及Spring + Jersey解决方案有什么区别?

时间:2014-11-09 02:46:43

标签: json spring api rest jersey

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

谁能告诉我这些有什么区别? Jersey REST,Spring Rest和Spring + Jersey Rest?

我的目标是构建一些以json作为输入/输出的rest API。我有jar文件作为后端进程逻辑来处理输入json / object并返回json / object。

非常感谢。

3 个答案:

答案 0 :(得分:23)

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可以更加可配置,但没有一些额外的工作。“ p>

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

由于您的“黄金”目标是带有JSON输入/输出的简单API,我建议您按照Spring REST guide进行操作。

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:1)

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

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

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

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