jersey框架应用实践

本章节在于记录研究某个项目时遇到的restful架构技术jersey框架,这里以自己写的一个简单例子作为切入jersey的参考。本次使用的架构是jersey+guice,jersey作为rest服务框架,guice作为di框架。使用内嵌jetty作为应用容器,舍弃web.xml配置。

进入正题:

一、maven依赖:

以下所列的依赖并非最小集。

 
  1.   <dependencies>

  2. <dependency>

  3.   <groupId>org.eclipse.jetty</groupId>

  4.   <artifactId>jetty-server</artifactId>

  5.   <version>8.1.19.v20160209</version>

  6. </dependency>

  7. <dependency>

  8.   <groupId>org.eclipse.jetty</groupId>

  9.   <artifactId>jetty-security</artifactId>

  10.   <version>8.1.19.v20160209</version>

  11. </dependency>

  12. <dependency>

  13.   <groupId>org.eclipse.jetty</groupId>

  14.   <artifactId>jetty-servlet</artifactId>

  15.   <version>8.1.19.v20160209</version>

  16. </dependency>

  17. <dependency>

  18.   <groupId>org.eclipse.jetty</groupId>

  19.   <artifactId>jetty-webapp</artifactId>

  20.   <version>8.1.19.v20160209</version>

  21. </dependency>

  22.  
  23.  
  24.     <dependency>

  25.         <groupId>javax.servlet</groupId>

  26.         <artifactId>javax.servlet-api</artifactId>

  27.         <version>3.1.0</version>

  28.         <scope>provided</scope>

  29.     </dependency>

  30. <dependency>

  31.   <groupId>org.codehaus.jackson</groupId>

  32.   <artifactId>jackson-core-asl</artifactId>

  33.   <version>1.9.9</version>

  34. </dependency>

  35. <dependency>

  36.   <groupId>org.codehaus.jackson</groupId>

  37.   <artifactId>jackson-jaxrs</artifactId>

  38.   <version>1.9.9</version>

  39. </dependency>

  40. <dependency>

  41.   <groupId>org.codehaus.jackson</groupId>

  42.   <artifactId>jackson-xc</artifactId>

  43.   <version>1.9.9</version>

  44. </dependency>

  45. <dependency>

  46.   <groupId>org.codehaus.jackson</groupId>

  47.   <artifactId>jackson-mapper-asl</artifactId>

  48.   <version>1.9.13</version>

  49. </dependency>

  50.     <dependency>

  51.         <groupId>org.glassfish.jersey.containers</groupId>

  52.         <artifactId>jersey-container-servlet</artifactId>

  53.         <version>2.19</version>

  54.     </dependency>

  55.     <dependency>

  56.     <groupId>org.glassfish.jersey.core</groupId>

  57.     <artifactId>jersey-client</artifactId>

  58.     <version>2.19</version>

  59. </dependency>

  60. <dependency>

  61.     <groupId>org.glassfish.jersey.containers</groupId>

  62.     <artifactId>jersey-container-jetty-servlet</artifactId>

  63.     <version>2.19</version>

  64. </dependency>

  65.     

  66.     <dependency>

  67.         <groupId>com.squarespace.jersey2-guice</groupId>

  68.         <artifactId>jersey2-guice</artifactId>

  69.         <version>0.10</version>

  70.     </dependency>

  71.  
  72.  
  73. <dependency>

  74.   <groupId>com.google.inject.extensions</groupId>

  75.   <artifactId>guice-servlet</artifactId>

  76.   <version>4.0</version>

  77. </dependency>

  78. <dependency>

  79.   <groupId>com.google.inject</groupId>

  80.   <artifactId>guice</artifactId>

  81.   <version>4.0</version>

  82. </dependency>

  83. <dependency>

  84.   <groupId>com.google.inject.extensions</groupId>

  85.   <artifactId>guice-assistedinject</artifactId>

  86.   <version>4.0</version>

  87. </dependency>

  88. <dependency>

  89.   <groupId>com.google.inject.extensions</groupId>

  90.   <artifactId>guice-persist</artifactId>

  91.   <version>4.0</version>

  92. </dependency>

  93.   <dependency>

  94.   <groupId>com.alibaba</groupId>

  95.   <artifactId>fastjson</artifactId>

  96.   <version>1.2.21</version>

  97.   </dependency>

  98. <dependency>

  99.     <groupId>commons-logging</groupId>

  100.     <artifactId>commons-logging</artifactId>

  101.     <version>1.2</version>

  102. </dependency>

  103.         <dependency>

  104.         <groupId>org.slf4j</groupId>

  105.         <artifactId>slf4j-api</artifactId>

  106.         <version>1.7.2</version>

  107.       </dependency>

  108.       <dependency>

  109.         <groupId>org.slf4j</groupId>

  110.         <artifactId>slf4j-log4j12</artifactId>

  111.         <version>1.7.2</version>

  112.       </dependency>

  113.   </dependencies>

二、内嵌jetty容器及配置

 
  1. import java.util.Collections;

  2. import java.util.List;

  3.  
  4.  
  5. import org.eclipse.jetty.server.Server;

  6. import org.eclipse.jetty.server.nio.SelectChannelConnector;

  7. import org.eclipse.jetty.servlet.ServletHolder;

  8. import org.eclipse.jetty.util.resource.Resource;

  9. import org.eclipse.jetty.util.thread.QueuedThreadPool;

  10. import org.eclipse.jetty.webapp.WebAppContext;

  11. import org.glassfish.jersey.servlet.ServletContainer;

  12. import org.slf4j.Logger;

  13. import org.slf4j.LoggerFactory;

  14.  
  15.  
  16. import com.google.inject.Module;

  17. import com.google.inject.servlet.GuiceFilter;

  18. import com.newland.jerseyTest.moudle.MyModule;

  19. import com.squarespace.jersey2.guice.JerseyGuiceServletContextListener;

  20.  
  21.  
  22. public class JerseyTestServer {

  23.  
  24. private static Logger LOG = LoggerFactory.getLogger(JerseyTestServer.class);

  25.  
  26. private Server server = null;

  27.  
  28. public void run() throws Exception{

  29. LOG.debug("starting......................");

  30. server = new Server();

  31.  
  32.  
  33. WebAppContext app = new WebAppContext();

  34. app.setContextPath("/");

  35. app.setBaseResource(Resource.newClassPathResource(""));

  36.  
  37. JerseyGuiceServletContextListener jgscl = new JerseyGuiceServletContextListener() {

  38.  
  39. @Override

  40. protected List<? extends Module> modules() {

  41. return Collections.singletonList(new MyModule());

  42. }

  43. };

  44. app.addEventListener(jgscl);//配置监听器

  45. app.addFilter(GuiceFilter.class, "/*", null);//配置过滤器

  46. ServletHolder sh = new ServletHolder(ServletContainer.class);

  47. sh.setInitParameter("jersey.config.server.provider.packages", "com.newland.jerseyTest.controller");//resource资源包路径

  48. sh.setInitOrder(1);

  49. app.addServlet(sh, "/my/v1/*");//配置servlet,servlet的前缀

  50.  
  51. server.setHandler(app);//启用web配置

  52. server.setThreadPool(new QueuedThreadPool(25));

  53. SelectChannelConnector conn = new SelectChannelConnector();

  54. conn.setPort(8088);//服务端口

  55. conn.setMaxIdleTime(600000);

  56. server.addConnector(conn);

  57. server.setSendServerVersion(false);

  58. server.setStopAtShutdown(true);

  59. app.start();

  60. server.start();//服务启动

  61. }

  62.  
  63. public void stop(){

  64. try {

  65. server.stop();

  66. } catch (Exception e) {

  67. LOG.error("stop failed.", e);

  68. }

  69. }

  70.  
  71. public static void main(String[] args) {

  72. JerseyTestServer server = null;

  73. try{

  74. server = new JerseyTestServer();

  75. if(server != null){

  76. server.run();

  77. }

  78. } catch(Exception e){

  79. LOG.error("Start failed.", e);

  80. if(server != null)server.stop();

  81. }

  82. }

  83. }

三、自定义module
guice创建injector(guice注入工具)需要一个module参数,该module是告诉guice如何在注入时注入哪个类的实例。

 
  1. import com.google.inject.AbstractModule;

  2. import com.google.inject.servlet.ServletModule;

  3. import com.newland.jerseyTest.service.MyService;

  4. import com.newland.jerseyTest.service.impl.MyServiceImpl;

  5.  
  6.  
  7. public class MyModule extends AbstractModule {

  8.  
  9.  
  10. @Override

  11. protected void configure() {

  12. install(new ServletModule(){

  13. protected void configureServlets(){

  14. bind(MyService.class).to(MyServiceImpl.class);//在需要注入MyService对象时,guice会据此注入MyServiceImpl实例

  15. }

  16. });

  17. }

  18.  
  19.  
  20. }

四、reset接口

这里可以体现reset风格的特点,参数可以在请求的uri中传递。我这里的接口只是用来接收请求和返回响应,业务处理交个service层处理,类似spring的controller或struts的action层。

 
  1. import java.util.HashMap;

  2. import java.util.Map;

  3. import javax.ws.rs.GET;

  4. import javax.ws.rs.Path;

  5. import javax.ws.rs.PathParam;

  6. import javax.ws.rs.Produces;

  7. import javax.ws.rs.core.Context;

  8. import javax.ws.rs.core.HttpHeaders;

  9. import javax.ws.rs.core.MediaType;

  10. import javax.ws.rs.core.Response;

  11. import javax.ws.rs.core.UriInfo;

  12. import com.alibaba.fastjson.JSON;

  13. import com.google.inject.Inject;

  14. import com.newland.jerseyTest.service.MyService;

  15. @Path("/test")

  16. public class MyController{

  17. @Inject

  18. private MyService myService;

  19. @GET

  20. @Path("{userName}")

  21. @Produces(MediaType.APPLICATION_JSON)

  22. public Response giveAnswer(@Context HttpHeaders headers, @Context UriInfo uri, 

  23. @PathParam("userName") String userName){

  24. String ret = myService.returnSomething(userName);

  25. Map<String, String> answer = new HashMap<String, String>();

  26. answer.put("message", ret);

  27. return Response.status(200).entity(JSON.toJSONString(answer)).build();

  28. }

  29. }

五、业务处理

业务处理接口

  1. public interface MyService {

  2. public String returnSomething(String userName);

  3. }

业务处理实现

  1. import com.newland.jerseyTest.service.MyService;

  2. public class MyServiceImpl implements MyService {

  3. @Override

  4. public String returnSomething(String userName) {

  5. return "Hello " + userName + " !!!";

  6. }

  7. }

六、测试

ok,一个使用jersey实现的rest服务就完成了。

猜你喜欢

转载自blog.csdn.net/qq_36838191/article/details/81298037
今日推荐