jersey框架應用實踐
阿新 • • 發佈:2019-01-24
本章節在於記錄研究某個專案時遇到的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容器及配置
三、自定義moduleimport 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(); } } }
guice建立injector(guice注入工具)需要一個module引數,該module是告訴guice如何在注入時注入哪個類的例項。
四、reset介面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風格的特點,引數可以在請求的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服務就完成了。