用jersey + spring 實現rest服務及單元測試


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());
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM