jersey提供了強大的rest功能,可以通過簡潔的標注和編碼實現業務的需求,架構會透明的把你的pojo對象轉化為客戶端可以接受的json/xml文件模式,當然也可以用它做一些基於ajax的表單提交和下載功能,這里簡單說下他在spirng中的設置
在pom中引入
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.17.1</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.17.1</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-spring</artifactId> <version>1.17.1</version> </dependency>
在 web.xml里面配置,其中com.sun.jersey.config.property.packages屬性設置我們的rest對外的業務類所在的包,本事例對外輸出json為主,所以設置POJOMappingFeature 為true。url-parttern 和 org.codehaus.enunciate.modules.jersey.config.ServletPath 設置rest的url的前綴,例如下面的為127.0.0.1/rest/xxxxx
com.sun.jersey.spi.spring.container.servlet.SpringServlet 這個為jersey 在spring中的路由統一處理模塊
<servlet> <servlet-name>jersey</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>mypackage.jersey.resource</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> <param-value>com.sun.jersey.api.container.filter.PostReplaceFilter</param-value> </init-param> <init-param> <param-name>org.codehaus.enunciate.modules.jersey.config.ServletPath</param-name> <param-value>/rest</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jersey</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>
咱們在剛才定義的 com.sun.jersey.config.property.packages 里面寫一個 rest服務類
import java.awt.PageAttributes.MediaType; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; @Component @Path("/demo") @Produces({ "application/json" }) public class DemoRest { @GET public DemoResult getDemo(@Context HttpServletRequest req) { DemoResult dr = new DemoResult("test", 19); return dr; } @GET @Path("name/{name}") public DemoResult getDemo1(@PathParam("name") String name) { DemoResult dr = new DemoResult(name, 19); return dr; } }
其中 DemoResult 為:
public class DemoResult { private String name; private int age; public DemoResult(String name, int age) { this.name = name; this.age = age; } }
啟動服務后,運行 127.0.0.1/rest/demo (對應getDemo)或者 127.0.0.1/rest/demo/name/hello (對應 getDemo1)就可以得到我們需要的json結果了
單元測試:
配置pom:
<dependency> <groupId>com.sun.jersey.jersey-test-framework</groupId> <artifactId>jersey-test-framework-core</artifactId> <version>1.17.1</version> </dependency> <dependency> <groupId>com.sun.jersey.jersey-test-framework</groupId> <artifactId>jersey-test-framework-grizzly2</artifactId> <version>1.17.1</version> </dependency>
我們寫一個測試基類,其中 mypackage.jersey.resource 為提供rest服務的類所在的包,例如上面的DemoRest所在的包。其他的配置和web.xml中jersey的配置參數一一對應
import javax.ws.rs.core.Application; import junit.framework.TestCase; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.request.RequestContextListener; import org.unitils.database.annotations.Transactional; import org.unitils.spring.annotation.SpringApplicationContext; import org.unitils.UnitilsJUnit4TestClassRunner; import org.unitils.database.util.TransactionMode; import com.sun.jersey.spi.spring.container.servlet.SpringServlet; import com.sun.jersey.test.framework.WebAppDescriptor;public abstract class BaseJerseyServiceTest extends com.sun.jersey.test.framework.JerseyTest { @Override protected WebAppDescriptor configure() { return new WebAppDescriptor.Builder("mypackage.jersey.resource") .contextParam( "contextConfigLocation", "classpath:JApplicationContext.xml") .servletClass(SpringServlet.class) .initParam("com.sun.jersey.api.json.POJOMappingFeature", "true") .initParam("com.sun.jersey.spi.container.ContainerRequestFilters", "com.sun.jersey.api.container.filter.PostReplaceFilter") .contextListenerClass(ContextLoaderListener.class) .requestListenerClass(RequestContextListener.class) .build(); } }
我們用這個測試類寫一個測試用例的半成品,其中params是模擬的get/post參數.運行即可。例子中測試的是 /shopInfo/trend?type=pv 這個rest請求
public class ShopInfoTest extends BaseJerseyServiceTest { private final static Logger logger = LoggerFactory .getLogger(ShopInfoTest.class); @Test public void test() { WebResource webResource = resource(); webResource.accept("application/json"); MultivaluedMap<String, String> params = new MultivaluedMapImpl(); params.add("type", "pv"); String response = webResource .path("/shopInfo/trend") .queryParams(params) .get(String.class); System.out.println(response.toString()); } }
