27.3 JAX-RS and Jarsey

如果你喜欢使用JAX-RS编程模型来开发REST端点,您可以使用一个可用的实现而不是Spring MVC.如果在您的应用程序上下文注册Servlet或Filter @Bean实例,Jersey 1.xApache CXF工作相当不错. Jersey 2.x有原生Spring支持,所以我们在Spring Boot中提供自动配置支持它,连同starter.

开始使用Jersey 2.x,你需要配置spring-boot-starter-jersey依赖并配置ResourceConfig类型的@Bean实例,然后你就可以在此实例中注册所有端点,如图所示

  1. @Component
  2. public class JerseyConfig extends ResourceConfig {
  3. public JerseyConfig() {
  4. register(Endpoint.class);
  5. }
  6. }

Warning

Jersey对扫描可执行归档的支持是相当有限的.例如,在运行一个可执行的war文件时,它不能将WEB-INF/classes中发现的包扫描为端点. 为了避免这种限制,packages方法不应使用并且端点应该通过register方法单独注册,如前面的示例所示.

对于更高级的定制,您也可以注册实现ResourceConfigCustomizer接口的任意数量实例.

所有的注册端点应该标注@Component注解并标注HTTP资源注解(@GET或者其他),如以下示例所示:

  1. @Component
  2. @Path("/hello")
  3. public class Endpoint {
  4. @GET
  5. public String message() {
  6. return "Hello";
  7. }
  8. }

由于Endpoint是Spring @Component,它的生命周期由Spring Boot管理且你可以使用@Autowired注解来注入依赖项并使用@Value注解注入外部配置.默认情况下,Jersey servlet被注册并映射到/*. 你可以通过添加@ApplicationPath注解到ResourceConfig上改变映射.

默认情况下,Jersey是被设置为一个Servlet的@Bean实例,它为命名为jerseyServletRegistrationServletRegistrationBean类型.默认情况下,使用懒加载初始化servlet,但是你可以通过设置spring.jersey.servlet.load-on-startup属性改变此特性. 您还可以创建你自己的具有相同名称的Bean实例来禁用或重写.您还可以通过设置spring.jersey.type=filter使用一个过滤器,而不是一个servlet(在这种情况下,@Bean方法来取代或覆盖jerseyFilterRegistration). 过滤器有一个@Order属性,您可以通过设置spring.jersey.filter.order进行设置.servlet和filter注册可通过使用spring.jersey.init.*属性配置的map属性提供初始化参数.

你可以参照Jersey例子来查看如何设置.当然也有Jersey 1.x版本的例子. 注意,在Jersey 1.x版本的例子中,spring-boot maven插件被配置为解压缩一些Jersey jars包,这样他们就会被JAX-RS实现扫描到(因为例子中要求他们能被Filter注册的过滤器扫描到). 如果您的JAX-RS资源被打包为嵌套jars,你也可能需要做同样的事情.