针对 REST Web 服务的 Spring4与 Jersey 的比较

我们计划使用 Spring 4.0.6版本开发一个新的应用程序。我们使用可以返回“ XML”或“ JSON”的控制器。 在前一个项目中,我们已经成功地使用 JAX-RS API 实现了 Jersey 和 Spring 对 REST 的支持,但是在阅读了一些前辈们的文章和建议后,他们说 Spring 提供了非常好的 REST 支持。

如果我在不使用 JAX-RS 和 Jersey 的情况下使用 Spring REST 支持,那么我真正感到困惑的一些问题是:

  1. 在 Spring MVC 中如何进行封送和解封送?

  2. 封送处理或解封送处理是否需要使用 jax-rs。

  3. 如果封送和解封是由 spring 自动处理的,那么它如何知道 xmlRootElement。

如果 Spring 证明了 REST 非常好的支持,那么为什么人们仍然使用 Jersey 来支持 REST 呢? Really looking to know more in details.

如果我说错了什么,请不要理会。 举例说明真的很有帮助。

先谢谢你! !

88253 次浏览

AFAIK Spring REST 支持基于 Spring MVC,而不是 JAX-RS 实现,而 Jersey 实现了 JAX-RS 规范。 那些在项目中使用 Spring (Core、 AOP 或 MVC)的人选择 Spring REST 支持而不是 JAX-RS 实现者。

我推荐 Jersey,因为它已经成熟,实现了 JAX-RS,而且易于使用。

我想说 Jersey 和 Spring MVC 都很棒——每个项目都有自己的风格和优势。无论如何,Stack Overflow 不是提出主观比较的正确地方(你的问题很快就会结束)。如果您已经将 Spring 用于其他所有事情,并且不使用 需要来使用 JAX-RS,那么 Spring MVC 完全有意义。

Regarding features like (un)marshalling, JAX-RS is just a spec after all - other libraries can offer similar features without implementing the same API.

  1. Spring MVC 使用 HttpMessageConverters来处理(非)编组 REST 资源,而不是 MessageBodyReader/Writers。Spring MVC 处理内容协商并选择最佳的可用转换器(您可以对方法进行注释,以提示它们生成/使用哪种媒体类型)。

  2. 不,没有必要使用 JAX-RS 来(解除)封送资源。事实上,JAX-RS 实现和 Spring MVC 使用第三方序列化库来完成这项工作; 因此它不受特定标准的约束。

  3. In its 4.0.6 version, Spring supports many HttpMessageConverters, with Jackson for JSON, JAXB for XML and many others. Spring 4.1.0 added more HttpMessageConverters:

为了回答最后一点,@XmlRootElement是一个 JAXB 注释,不是 JAX-RS. Spring 支持 JAXB的一部分。

有关 Spring 中 REST 的更完整示例,请查看 这个入门指南(您将在10-15分钟内得到一个运行的完整示例)。

同样,您问题的最后一部分是相当主观的——在 JVM 中构建 REST 服务有很多流行的解决方案,而不仅仅是 Jersey 和 Spring (DropWizard,Play!架构等)。