zoukankan      html  css  js  c++  java
  • 用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());
        }
    }
  • 相关阅读:
    Uipath-Close Application和Close Window区别
    我与某猪同学斗智斗勇的那些事
    可视报表(Project)
    自定义函数(Power Query 之 M 语言)
    报表(Project)
    拆分…Split…(Power Query 之 M 语言)
    参加Mos考试
    主要视图展示(Project)
    听听文档(视频)-Power Pivot
    突出显示(Project)
  • 原文地址:https://www.cnblogs.com/wully/p/3337170.html
Copyright © 2011-2022 走看看