8.1.2. JAX-RS 和Jersey

如果您更喜欢 REST 端点的 JAX-RS 编程模型,则可以使用可用的实现之一而不是 Spring MVC。 JerseyApache CXF开箱即用,运行良好。CXF 要求您在应用程序上下文中将其注册为ServletFilter作为 @Bean 。Jersey 有一些原生 Spring 支持,因此我们还在 Spring Boot 中为其提供自动配置支持以及启动器。

要开始使用 Jersey,请包含 spring-boot-starter-jersey 作为依赖项,然后您需要一个ResourceConfig类型的 @Bean,在其中注册所有端点,如以下示例所示:

@Component
public class MyJerseyConfig extends ResourceConfig {

    public MyJerseyConfig() {
        register(MyEndpoint.class);
    }

}

Jersey 对扫描可执行档案的支持相当有限。例如,它无法扫描在完全可执行的 jar 文件中或WEB-INF/classes运行可执行的 war 文件时找到的包中的端点。为了避免这种限制,不应使用packages方法,而应使用该register方法单独注册端点,如前面的示例所示。

对于更高级的自定义,您还可以注册任意数量的ResourceConfigCustomizer实现.

所有注册的端点都应该是带有HTTP资源注释(@GET和其他)的@Components,如下例所示:

@Component
@Path("/hello")
public class MyEndpoint {

    @GET
    public String message() {
        return "Hello";
    }

}

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

默认情况下,Jersey 在名为 jerseyServletRegistrationServletRegistrationBean 类型的 @Bean中设置为 servlet。默认情况下,Servlet 是延迟初始化的,但您可以通过设置 spring.jersey.servlet.load-on-startup来自定义该行为。您可以通过创建您自己的同名 bean 来禁用或覆盖该 bean。您还可以通过设置 spring.jersey.type=filter来使用过滤器而不是 servlet(在这种情况下,要替换或覆盖的 @Bean 是 jerseyFilterRegistration)。该过滤器有一个@Order,您可以使用spring.jersey.filter.order 设置它。当使用 Jersey 作为过滤器时,必须存在一个 servlet 来处理任何未被 Jersey 拦截的请求。如果您的应用程序不包含此类 servlet,您可能需要通过将server.servlet.register-default-servlet设置为 true来启用默认 servlet。 servlet 和过滤器注册都可以通过使用 spring.jersey.init.* 指定属性映射来指定初始化参数。

最后更新于