【问题标题】:Difference between JAX-RS and Spring RestJAX-RS 和 Spring Rest 的区别
【发布时间】:2017-08-14 03:52:51
【问题描述】:

我对 JAX-RS(好吧,也许应该使用 Jersey 进行比较,因为 JAX-RS 只是规范)和 Spring for Restful services 之间的区别感到困惑。我试图在网上搜索更多信息,它变得更加混乱。我的公司正在使用 Spring MVC 开发 Restful APIs

令人困惑的部分是,JAX-RS 代表 Java API for RESTful Web Services,在 Spring 中我也使用 java 开发 RESTful Web Services,所以我实际上并没有得到区别。 Spring 是否遵循 JAX-RS 规范?

据我所知:

  1. JAX-RS 是一个蓝图/规范,它有 Jersey、RESTeasy 等作为实现。

【问题讨论】:

  • @CássioMazzochiMolin 感谢您的回答,我会再接受一段时间,还有一个问题,您提到 Spring Framework 不是 JAX-RS 实现,Spring 遵循哪个规范?谢谢
  • 它没有实现任何特定的规范。这只是做事的Spring 方式。 REST 功能由spring-webmvc 模块提供,该模块还提供 Spring 的模型视图控制器。

标签: spring-mvc jersey jax-rs


【解决方案1】:

JAX-RS

JAX-RS 是一个 specification,用于在 Java 中实现 REST Web 服务,目前由 JSR-370 定义。它是Java EE technologies 的一部分,目前由JSR 366 定义。

Jersey(随 GlassFish 和 Payara 提供)是 JAX-RS 参考实现,但是还有其他实现,例如 RESTEasy(随 JBoss EAP 和 WildFly 提供)和 Apache CXF(随 TomEE 和 WebSphere 提供) .

Spring 框架

Spring Framework 是一个full framework,它允许您创建 Java 企业应用程序。 REST 功能由Spring MVC 模块(提供model-view-controller 功能的同一模块)提供。它不是 JAX-RS 实现,可以看作是 JAX-RS 标准的 Spring 替代方案。

Spring 生态系统还提供wide range of projects 用于创建企业应用程序,涵盖持久性、安全性、与社交网络的集成、批处理等。

示例

考虑使用 JAX-RS API 的以下资源控制器:

@Path("/greetings")
public class JaxRsController {

    @GET
    @Path("/{name}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response greeting(@PathParam("name") String name) {

        String greeting = "Hello " + name;
        return Response.ok(greeting).build();
    }
}

使用 Spring MVC API 的等效实现是:

@RestController
@RequestMapping("/greetings")
public class SpringRestController {

    @RequestMapping(method = RequestMethod.GET,
                    value = "/{name}", 
                    produces = MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<?> greeting(@PathVariable String name) {

        String greeting = "Hello " + name;
        return new ResponseEntity<>(greeting, HttpStatus.OK);
    }
}

使用 Spring Boot 和 Jersey

​​>

Spring Boot 提供了spring-boot-starter-jersey 模块,允许您将 JAX-RS 编程模型用于 REST 端点而不是 Spring MVC。它适用于 Jersey 2.x。

有关使用 Jersey 2.x 和 Spring Boot 1.4.x 创建 Web 应用程序的完整示例,请参阅answer

【讨论】:

  • 那么如果我们使用spring MVC并将其部署在GlassFish/Payara中,我们是否需要禁用服务器中的jax-rs实现?
  • 这篇文章是否适用于 spring 4 dzone.com/articles/… ? spring web 比 spring + Jersey (JAX-RS) 更适合做 rest 网络服务?
【解决方案2】:

注释差异

(截至 2018 年)Spring MVC 尚未标准化为 JAX-RS 注释,因为它的解决方案早于 JAX-RS。以下是等价物:

https://stormpath.com/blog/jax-rs-vs-spring-rest-endpoints

如果您使用的是非标准化 API,您应该预计它们会在几年内被弃用并可能被更新的实验性 API 取代。向后兼容性的责任要少得多(例如,当发布新的 JDK 版本时)。

【讨论】:

    【解决方案3】:

    我使用 Jersey Rest、spring rest 和 Jersey Rest with spring。它们都是非常丰富的框架,具有很好的实现。如果您使用其他 Spring 服务,例如 ORM、Spring security 和 DI 等,我建议最好使用 Spring rest。两者都是 Spring 库,所以我觉得管理代码和依赖关系有点容易

    JAX-RS 专业人士:

    • JSR 标准可以在没有 servlet 容器的情况下运行(grizzly,简单, ...)
    • 生产就绪实施(jersey、cxf、resteasy、restlet、 ...) 专为 REST 应用程序设计

    Spring MVC 专家:

    • 提供“完整”堆栈,而不仅仅是 REST 工具

    • 依赖注入/AOP/事务

    • 可插入视图模板(JSP、freemarker、velocity 等)

    您可以通过以下链接查看更多信息

    1. https://www.infoq.com/articles/springmvc_jsx-rs
    2. Why use JAX-RS / Jersey?

    【讨论】:

    • 但是,JAX-RS 也可以与 Spring 一起使用(用于 DI、AOP 等)。
    【解决方案4】:

    JAX-RS 是规范,jersey 等是它的实现。 人们使用 Spring 来制作 RestFul Web 服务,因为 Spring 与 Restful 实现一起提供了诸如休眠集成之类的东西,以及诸如 IOC 和面向方面的编程之类的东西。

    如果我们使用 jersey 来实现,问题将是必须使用一些 ORM 技术从后端获取数据,并且我们必须为此编写样板代码。

    这就是人们甚至企业使用 Spring 以及 Rest 实现的原因,它也提供了 Spring 设施。现在使用最新的 Spring boot 实现,我们可以非常快速地开始开发,而无需大量配置。

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2015-02-03
      • 2017-11-12
      • 2013-07-27
      相关资源
      最近更新 更多