jersey框架應用實踐

本章節在於記錄研究某個項目時遇到的restful架構技術jersey框架,這裏以自己寫的一個簡單例子作爲切入jersey的參考。本次使用的架構是jersey+guice,jersey作爲rest服務框架,guice作爲di框架。使用內嵌jetty作爲應用容器,捨棄web.xml配置。

進入正題:

一、maven依賴:

以下所列的依賴並非最小集。

  <dependencies>
	<dependency>
	  <groupId>org.eclipse.jetty</groupId>
	  <artifactId>jetty-server</artifactId>
	  <version>8.1.19.v20160209</version>
	</dependency>
	<dependency>
	  <groupId>org.eclipse.jetty</groupId>
	  <artifactId>jetty-security</artifactId>
	  <version>8.1.19.v20160209</version>
	</dependency>
	<dependency>
	  <groupId>org.eclipse.jetty</groupId>
	  <artifactId>jetty-servlet</artifactId>
	  <version>8.1.19.v20160209</version>
	</dependency>
	<dependency>
	  <groupId>org.eclipse.jetty</groupId>
	  <artifactId>jetty-webapp</artifactId>
	  <version>8.1.19.v20160209</version>
	</dependency>


    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
	<dependency>
	  <groupId>org.codehaus.jackson</groupId>
	  <artifactId>jackson-core-asl</artifactId>
	  <version>1.9.9</version>
	</dependency>
	<dependency>
	  <groupId>org.codehaus.jackson</groupId>
	  <artifactId>jackson-jaxrs</artifactId>
	  <version>1.9.9</version>
	</dependency>
	<dependency>
	  <groupId>org.codehaus.jackson</groupId>
	  <artifactId>jackson-xc</artifactId>
	  <version>1.9.9</version>
	</dependency>
	<dependency>
	  <groupId>org.codehaus.jackson</groupId>
	  <artifactId>jackson-mapper-asl</artifactId>
	  <version>1.9.13</version>
	</dependency>	
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
	    <groupId>org.glassfish.jersey.core</groupId>
	    <artifactId>jersey-client</artifactId>
	    <version>2.19</version>
	</dependency>
	<dependency>
	    <groupId>org.glassfish.jersey.containers</groupId>
	    <artifactId>jersey-container-jetty-servlet</artifactId>
	    <version>2.19</version>
	</dependency>
    
    <dependency>
        <groupId>com.squarespace.jersey2-guice</groupId>
        <artifactId>jersey2-guice</artifactId>
        <version>0.10</version>
    </dependency>


	<dependency>
	  <groupId>com.google.inject.extensions</groupId>
	  <artifactId>guice-servlet</artifactId>
	  <version>4.0</version>
	</dependency>
	<dependency>
	  <groupId>com.google.inject</groupId>
	  <artifactId>guice</artifactId>
	  <version>4.0</version>
	</dependency>
	<dependency>
	  <groupId>com.google.inject.extensions</groupId>
	  <artifactId>guice-assistedinject</artifactId>
	  <version>4.0</version>
	</dependency>
	<dependency>
	  <groupId>com.google.inject.extensions</groupId>
	  <artifactId>guice-persist</artifactId>
	  <version>4.0</version>
	</dependency>
  	<dependency>
  		<groupId>com.alibaba</groupId>
  		<artifactId>fastjson</artifactId>
  		<version>1.2.21</version>
  	</dependency>
	<dependency>
	    <groupId>commons-logging</groupId>
	    <artifactId>commons-logging</artifactId>
	    <version>1.2</version>
	</dependency>
  	      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.2</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.2</version>
      </dependency>
  </dependencies>

二、內嵌jetty容器及配置

import java.util.Collections;
import java.util.List;


import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.glassfish.jersey.servlet.ServletContainer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import com.google.inject.Module;
import com.google.inject.servlet.GuiceFilter;
import com.newland.jerseyTest.moudle.MyModule;
import com.squarespace.jersey2.guice.JerseyGuiceServletContextListener;


public class JerseyTestServer {
	
	private static Logger LOG = LoggerFactory.getLogger(JerseyTestServer.class);
	
	private Server server = null;
	
	public void run() throws Exception{
		LOG.debug("starting......................");
		server = new Server();


		WebAppContext app = new WebAppContext();
		app.setContextPath("/");
		app.setBaseResource(Resource.newClassPathResource(""));
		
		JerseyGuiceServletContextListener jgscl = new JerseyGuiceServletContextListener() {
			
			@Override
			protected List<? extends Module> modules() {
				return Collections.singletonList(new MyModule());
			}
		};
		app.addEventListener(jgscl);//配置監聽器
		app.addFilter(GuiceFilter.class, "/*", null);//配置過濾器
		ServletHolder sh = new ServletHolder(ServletContainer.class);
		sh.setInitParameter("jersey.config.server.provider.packages", "com.newland.jerseyTest.controller");//resource資源包路徑
		sh.setInitOrder(1);
		app.addServlet(sh, "/my/v1/*");//配置servlet,servlet的前綴
		
		server.setHandler(app);//啓用web配置
		server.setThreadPool(new QueuedThreadPool(25));
		SelectChannelConnector conn = new SelectChannelConnector();
		conn.setPort(8088);//服務端口
		conn.setMaxIdleTime(600000);
		server.addConnector(conn);
		server.setSendServerVersion(false);
		server.setStopAtShutdown(true);
		app.start();
		server.start();//服務啓動
	}
	
	public void stop(){
		try {
			server.stop();
		} catch (Exception e) {
			LOG.error("stop failed.", e);
		}
	}
	
	public static void main(String[] args) {
		JerseyTestServer server = null;
		try{
			server = new JerseyTestServer();
			if(server != null){
				server.run();
			}
		} catch(Exception e){
			LOG.error("Start failed.", e);
			if(server != null)server.stop();
		}
	}
}
三、自定義module
guice創建injector(guice注入工具)需要一個module參數,該module是告訴guice如何在注入時注入哪個類的實例。

import com.google.inject.AbstractModule;
import com.google.inject.servlet.ServletModule;
import com.newland.jerseyTest.service.MyService;
import com.newland.jerseyTest.service.impl.MyServiceImpl;


public class MyModule extends AbstractModule {


	@Override
	protected void configure() {
		install(new ServletModule(){
			protected void configureServlets(){
				bind(MyService.class).to(MyServiceImpl.class);//在需要注入MyService對象時,guice會據此注入MyServiceImpl實例
			}
		});
	}


}
四、reset接口

這裏可以體現reset風格的特點,參數可以在請求的uri中傳遞。我這裏的接口只是用來接收請求和返回響應,業務處理交個service層處理,類似spring的controller或struts的action層。

import java.util.HashMap;
import java.util.Map;


import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;


import com.alibaba.fastjson.JSON;
import com.google.inject.Inject;
import com.newland.jerseyTest.service.MyService;


@Path("/test")
public class MyController{
	
	@Inject
	private MyService myService;
	
	@GET
	@Path("{userName}")
	@Produces(MediaType.APPLICATION_JSON)
	public Response giveAnswer(@Context HttpHeaders headers, @Context UriInfo uri, 
			@PathParam("userName") String userName){
		String ret = myService.returnSomething(userName);
		Map<String, String> answer = new HashMap<String, String>();
		answer.put("message", ret);
		return Response.status(200).entity(JSON.toJSONString(answer)).build();
	}
}
五、業務處理

業務處理接口

public interface MyService {
	public String returnSomething(String userName);
}
業務處理實現
import com.newland.jerseyTest.service.MyService;




public class MyServiceImpl implements MyService {


	@Override
	public String returnSomething(String userName) {
		return "Hello " + userName + " !!!";
	}


}
六、測試

ok,一個使用jersey實現的rest服務就完成了。






發佈了33 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章