Jersey是一个很好的Java REST API库。当你用Jersey实现REST的时候。是很自然的。同一时候Spring Boot是Java世界中还有一个很好的工具。它降低了程序的应用配置()。这篇博客就介绍下怎样将Jersey和Spring Boot结合起来使用。
须要注意的是Jersey本身自带了hk2这样一个DI库,所以,在结合Spring Boot使用的时候,是比較easy搞混淆的。简单的讲,你应该分清楚,哪一部分是由Spring来管理,哪一部分是由Jersey的hk2来管理。
创建一个JerseyConfig类,用来配置Jersey:
public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(JacksonFeature.class); register(ProductsResource.class); register(ProductRepository.class); } }
当中,ProductsResource是我们的REST API:
@Path("/products") public class ProductsResource { @Inject private ProductRepository productRepository; //... ... @GET @Path("{id}") @Produces(MediaType.APPLICATION_JSON) public ProductRefJson getProductById(@PathParam("id") int id) { final Product product = productRepository.findByProductId(id); if (product == null) { throw new ResourceNotFoundException(); } return new ProductRefJson(product); } }
ProductRespository就是我们查找Product的类,这里须要注意的一点是我们看到ProductsResource并不含有类似@Component这种annotation,这是由于这个类是REST API,它应该由Jersey中的hk2来管理,所以,不要加@Component。
这样,我们已经完毕了Jersey REST API所须要的最简配置。以下就是让Spring Boot怎么知道Jersey的存在:
@EnableAutoConfiguration public class Application{ public static void main(String[] args) { new SpringApplicationBuilder(Application.class) .showBanner(false) .run(args); } @Bean public ServletRegistrationBean jerseyServlet() { ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*"); registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName()); return registration; }}
启动Application就能执行这个REST Webservie了:
curl -X GET http://localhost:8080/products/1
返回结果:
{"id":1,"name":"apple juice","uri":"/products/1","pricings_uri":"/products/1/pricings","current_price":{"uri":"/products/1/current","price":0},"description":"good"}
博客完毕的比較仓促,假设有描写叙述错误或者不准确的地方。欢迎指出来。