有人能告诉我这些的区别吗?Jersey REST、Spring REST和Spring+Jersey REST?
我的目标是构建几个以JSON作为输入/输出的REST API。我有一个jar文件作为后端处理逻辑,用于处理输入的JSON/object并返回JSON/object。
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指南。
一个主要的区别在于单元测试支持方面。
Jersey测试框架不适合用来模拟服务器端代码 - 例如,如果您的REST资源依赖于某个服务,您希望在测试资源方法时模拟该服务。然而,Jersey测试运行在单独的容器中,而单元测试则会调用正在运行的REST资源实例 - 目前为止,我尚未找到任何文档或方法可以模拟服务器端代码。
相反,Spring MVC测试不需要任何容器,并且与其控制器更好地集成。依赖注入可用于注入模拟服务/ DAO,以进行更好的单元测试。
我还发现,与Jersey相比,Spring项目的文档更加成熟。
一个微妙的区别在于资源 (Jersey) 或控制器 (Spring) 对象的实例化。
Jersey为每个请求新建一个资源对象。而默认情况下,Spring将控制器视为具有单例默认范围的bean。这可以通过@Scope注释覆盖(尽管如果您这样做,它会被Sonar标记)。
Spring的这种默认行为已经多次影响了我们的应用程序。由于控制器类是单例的,所有类成员都是有效的静态成员。因此,处理一个请求设置的值仍然会保留到下一个请求。
如果您使用Spring,请注意这一点。我的建议是将控制器类@Scope为prototype,即使这样做会在Sonar扫描中获得警告。