JAX-RS和Spring Rest之间的区别


137

我对JAX-RS(由于JAX-RS只是规格)也许应该使用Jersey进行比较)与Spring for Restful服务之间的区别感到困惑。我试图在网上搜索更多信息,但变得更加混乱。我公司正在使用Spring MVC开发Restful API

令人困惑的部分是,JAX-RS代表用于RESTful Web服务的Java API,在春季,我还使用Java来开发RESTful Web服务,因此我实际上并没有区别。Spring是否遵循JAX-RS规范?

从我所知道的到现在:

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

@CássioMazzochiMolin感谢您的回答,我将在一段时间内接受它,还有一个问题,您提到Spring框架不是JAX-RS实现,Spring遵循哪个规范?谢谢
hades

3
它没有实现任何特定的规范。这只是春天做事的方式。该spring-webmvc模块提供了REST功能,该模块还提供了Spring的model-view-controller。
cassiomolin

Answers:


149

JAX-RS

JAX-RS是用于以Java实现REST Web服务的规范,当前由JSR-370定义。它是JSR 366当前定义的Java EE技术的一部分。

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

春季框架

Spring框架是一个完整的框架,它允许你创建Java企业应用程序。REST功能由Spring MVC模块提供(同一模块提供模型视图控制器功能)。它不是JAX-RS的实现,可以看作是JAX-RS标准的Spring替代方案。

Spring生态系统还提供了用于创建企业应用程序的广泛项目,涉及持久性,安全性,与社交网络的集成,批处理等。

例子

考虑使用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应用程序的完整示例,请参考此答案


因此,如果我们使用spring MVC并在GlassFish / Payara中对其进行配置,是否需要在服务器中禁用jax-rs实现?
Pradeep_Evol,

本文适用于Spring 4dzone.com/articles/…吗?Spring Web可以更好地制作resT Web服务,而不仅仅是spring + Jersey(JAX-RS)?
tgkprog

58

注释差异

(截至2018年)Spring MVC尚未标准化为JAX-RS批注,因为其解决方案早于JAX-RS。以下是等效项:

在此处输入图片说明

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

如果您使用的是非标准化的API,那么您应该期望它们会在几年后被较新的实验性API淘汰,并有可能被较新的实验性API所取代。向后兼容性的责任要少得多(例如,发布新的JDK版本时)。


非常感谢,这太棒了
Bejond

26

我曾与Jersey Rest,Spring Rest和Jersey Rest一起工作。它们都是非常丰富的框架,具有很好的实现。我建议如果您正在使用其他Spring服务(例如ORM,Spring安全性和DI等),最好使用Spring rest。两者都是Spring库,因此我觉得管理代码和依赖项有点容易

JAX-RS的优点:

  • JSR标准可以在没有servlet容器的情况下运行(灰熊,简单,...)
  • 仅针对REST应用程序设计的可量产的实现(球衣,cxf,resteasy,restlet等)

Spring MVC优点:

  • 提供“完整”堆栈,而不仅仅是REST功能

  • 依赖注入/ AOP /事务

  • 可插拔视图模板(JSP,freemarker,力度等)

您可以在以下链接上查看更多信息

  1. https://www.infoq.com/articles/springmvc_jsx-rs
  2. 为什么使用JAX-RS / Jersey?

4
但是,JAX-RS也可以与Spring一起使用(用于DI,AOP等)。
迪蒙

5

JAX-RS是其规格,球衣等是其实现。人们之所以使用Spring来制作RestFul Web服务,是因为Spring与宁静的实现一起提供了诸如休眠集成之类的功能,还提供了诸如IOC和面向方面的编程之类的功能。

好像我们使用jersey来实现那样,问题在于必须使用某些ORM技术从后端获取数据,并且我们必须为此编写样板代码。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.