1. 概述

在本篇文章中,我们将对比 JAX-RSSpring MVC 在开发 REST API 时的差异。

2. Jakarta RESTful Web Services(JAX-RS)

要成为 Java EE 生态的一部分,一个技术必须具备规范(Specification)、兼容实现(Compatible Implementation)以及 TCK
JAX-RS 是一套用于构建 RESTful Web Services 的规范,其最知名的参考实现包括 RESTEasyJersey

我们通过一个简单的 Controller 来快速了解 Jersey:

@Path("/hello")
public class HelloController {

    @GET
    @Path("/{name}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response hello(@PathParam("name") String name) {
        return Response.ok("Hello, " + name).build();
    }

}

上面这段代码定义了一个 /hello/{name} 接口,返回 text/plain 类型响应。
其中:

  • @Path 定义了资源路径;
  • @GET 表示这是一个 GET 请求;
  • @Produces 指定响应内容类型;
  • 参数通过 @PathParam 注入。

⚠️ 注意:JAX-RS 本身只是一个规范,需要依赖具体实现(如 Jersey 或 RESTEasy)才能运行。

3. 使用 Spring MVC 实现 REST 接口

Spring MVC 是 Spring Framework 中用于构建 Web 应用的核心模块,它天然支持 REST 风格的服务开发。

下面是使用 Spring MVC 实现相同功能的示例:

@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping(value = "/{name}", produces = MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<?> hello(@PathVariable String name) {
        return new ResponseEntity<>("Hello, " + name, HttpStatus.OK);
    }

}

这段代码使用了以下关键注解:

  • @RestController 标识这是一个 REST 控制器;
  • @RequestMapping 定义基础路径;
  • @GetMapping 明确指定该方法处理 GET 请求;
  • @PathVariable 用于提取路径变量;
  • 返回值为 ResponseEntity,便于控制状态码和响应头。

4. 主要区别

特性 JAX-RS Spring MVC
类型 规范(Specification) 框架(Framework)
实现 需要第三方实现(如 Jersey、RESTEasy) 自带完整实现
注解风格 更贴近标准 HTTP 语义 更贴近 Spring 生态
DI 支持 ❌ 原生不支持依赖注入 ✅ 支持 Spring DI
集成能力 ⚠️ 需额外配置与其他框架集成 ✅ 天然集成 Spring Security、Spring Data、Spring AOP 等
学习曲线 简洁但需熟悉规范细节 若已有 Spring 经验则上手快

📌 踩坑提示:

  • 如果项目已经重度依赖 Spring 生态,强行引入 JAX-RS 可能导致配置混乱;
  • JAX-RS 的灵活性高,适合对底层协议有定制需求的场景;
  • Spring MVC 则更适合快速搭建企业级应用,尤其在微服务架构中更受欢迎。

5. 总结

在这篇文章中,我们比较了 JAX-RS 和 Spring MVC 在 REST API 开发中的不同点。

✅ 如果你追求轻量、标准化、可移植性强的方案,可以考虑 JAX-RS;
✅ 如果你在 Spring 生态下开发,或者希望享受强大的集成能力和成熟的工具链,那么 Spring MVC 是更好的选择。

一如既往,本文所有代码示例均可在 GitHub 上获取:GitHub 示例代码


原始标题:REST API: JAX-RS vs Spring