经常编写 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
首先,您需要向您的应用程序添加依赖项。
|
您唯一需要做的就是将 Jersey
ResourceConfig
类添加到您的 Spring 上下文中。
|
现在您可以开始编写 JAX-RS 端点类。每个端点类都必须是一个 Spring bean,以便能够在 JAX-RS 端点内使用 Spring DI。例如,这是一个非常简单的端点:
|
当您在
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 的支持。您需要做几件事。
首先你需要添加依赖。
|
其次,您需要为 Swagger 配置
BeanConfig
。您可以在
ResourceConfig
类中执行此操作。
|
这个
BeanConfig
可以配置需要的信息,大部分信息你可以从Spring Boot的配置中得到,比如支持的方案、端口、主机……第三,你需要注册Swagger资源。
|
现在不要忘记使用
@Api
注释您的资源,以便 Swagger 将拾取它们。
具有 WADL 和 Swagger 支持的完整
ResourceConfig
看起来像这样:
|
结论
JAX-RS 和 Spring Boot 非常容易集成。 JAX-RS 或 Spring MVC REST 端点的选择是个人的选择,两者具有相同的功能,一些更容易在其中一个或另一个中实现。就个人而言,对于 REST 服务,我更喜欢 JAX-RS。它是为此目的而构建的,API 在易用性方面反映了这一选择。