27.3 JAX-RS and Jarsey
如果你喜欢使用JAX-RS编程模型来开发REST端点,您可以使用一个可用的实现而不是Spring MVC.如果在您的应用程序上下文注册Servlet或Filter @Bean实例,Jersey 1.x和Apache CXF工作相当不错. Jersey 2.x有原生Spring支持,所以我们在Spring Boot中提供自动配置支持它,连同starter.
开始使用Jersey 2.x,你需要配置spring-boot-starter-jersey
依赖并配置ResourceConfig
类型的@Bean实例,然后你就可以在此实例中注册所有端点,如图所示
@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(Endpoint.class);
}
}
Warning
Jersey对扫描可执行归档的支持是相当有限的.例如,在运行一个可执行的war文件时,它不能将WEB-INF/classes中发现的包扫描为端点. 为了避免这种限制,
packages
方法不应使用并且端点应该通过register
方法单独注册,如前面的示例所示.
对于更高级的定制,您也可以注册实现ResourceConfigCustomizer
接口的任意数量实例.
所有的注册端点应该标注@Component注解并标注HTTP资源注解(@GET或者其他),如以下示例所示:
@Component
@Path("/hello")
public class Endpoint {
@GET
public String message() {
return "Hello";
}
}
由于Endpoint
是Spring @Component
,它的生命周期由Spring Boot管理且你可以使用@Autowired注解来注入依赖项并使用@Value注解注入外部配置.默认情况下,Jersey servlet被注册并映射到/*.
你可以通过添加@ApplicationPath注解到ResourceConfig上改变映射.
默认情况下,Jersey是被设置为一个Servlet的@Bean
实例,它为命名为jerseyServletRegistration
的ServletRegistrationBean
类型.默认情况下,使用懒加载初始化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,你也可能需要做同样的事情.