在 Spring Boot 中使用 JAX-RS 而不是 MVC

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

经常编写 REST API 的 Spring 用户非常熟悉 Spring MVC REST 支持来编写他们的端点。然而,Java EE 用户更习惯于 JAX-RS 规范。然而,将 JAX-RS 集成到 Spring 应用程序中真的很容易,尤其是 Spring Boot 应用程序。

为什么

但你为什么要这样做? Spring MVC 应该够了吧?好吧,对于 JAX-RS 规范固有的简洁性,有话要说。尽管 Spring MVC 方法已足够,但 JAX-RS 仅针对实现 REST API。 Spring MVC 并不是为这个目的单独和个人而构建的,我认为它表明了这一点。有时它可能有点冗长或令人困惑。

例如,如果您在 Spring MVC REST 控制器上省略了一个方法,Spring MVC 会愉快地假设您希望此端点可用于所有 HTTP 方法。出于 MVC 的目的,这可能没问题,但对于 REST,则不然。如果您将方法添加到 @RequestMapping ,您突然无法使用简洁的表示法,需要在表示法上显式 value 参数。为 andpoint 设置明确的 MIME 类型也是一样的。在那种情况下,我真的很喜欢 JAX-RS API 具有的 @GET @POST @Produces @Consumes 参数。您最终可能会得到更多注释,但至少一切都清楚且明确定义。

目前,我还没有发现 Spring MVC 可以为 REST 做 JAX-RS 做不到的任何事情。

在 Spring Boot 中启用 Jersey

首先,您需要向您的应用程序添加依赖项。


 compile "org.springframework.boot:spring-boot-starter-jersey"

您唯一需要做的就是将 Jersey ResourceConfig 类添加到您的 Spring 上下文中。


 compile "org.springframework.boot:spring-boot-starter-jersey"

现在您可以开始编写 JAX-RS 端点类。每个端点类都必须是一个 Spring bean,以便能够在 JAX-RS 端点内使用 Spring DI。例如,这是一个非常简单的端点:


 compile "org.springframework.boot:spring-boot-starter-jersey"

当您在 ResourceConfig 类 ( register(HelloWorldEndpoint.class); ) 中注册此端点时,端点将可用,在本例中为 /hello/world

额外的东西

Spring Boot 中的 Jersey 集成使您能够使用 Jersey 使用的每个功能,例如 @Provider 注释类。请记住在 ResourceConfig 类中注册它们,Spring 不会像标准 Java EE 那样自动选择它们。您可以使用一些类路径扫描技巧,使用某些 JAX-RS 注释自动注册 bean,或者您可以选择注册整个包(使用 packages(...); 在您的 ResourceConfig 中)。

使用 Jersey,您还可以免费获得一些非常好的功能,例如内置的 WADL 支持。您只需要注册 WadlResource 类就可以了。我喜欢 JAX-RS 的另一个特性是 @BeanParam 的概念。您可以为您的端点参数声明整个 bean,并使用 @HeaderParam @QueryParam 注释字段,在某些情况下,这可以让生活变得更轻松,并且您的端点更具可读性和简洁性。如果您想了解您还可以使用什么,请查看 Jersey 文档。

奖励:添加 Swagger 支持

Swagger 正在迅速转变为 REST API 的首选文档框架。想要使用 Swagger 的 Spring 用户可以使用 SpringFox 进行集成,但 Swagger 内置了对 JAX-RS 的支持。您需要做几件事。

首先你需要添加依赖。


 compile "org.springframework.boot:spring-boot-starter-jersey"

其次,您需要为 Swagger 配置 BeanConfig 。您可以在 ResourceConfig 类中执行此操作。


 compile "org.springframework.boot:spring-boot-starter-jersey"

这个 BeanConfig 可以配置需要的信息,大部分信息你可以从Spring Boot的配置中得到,比如支持的方案、端口、主机……第三,你需要注册Swagger资源。


 compile "org.springframework.boot:spring-boot-starter-jersey"

现在不要忘记使用 @Api 注释您的资源,以便 Swagger 将拾取它们。

具有 WADL 和 Swagger 支持的完整 ResourceConfig 看起来像这样:


 compile "org.springframework.boot:spring-boot-starter-jersey"

结论

JAX-RS 和 Spring Boot 非常容易集成。 JAX-RS 或 Spring MVC REST 端点的选择是个人的选择,两者具有相同的功能,一些更容易在其中一个或另一个中实现。就个人而言,对于 REST 服务,我更喜欢 JAX-RS。它是为此目的而构建的,API 在易用性方面反映了这一选择。