使用Spring与CXF编写rest服务

来源:互联网 发布:极点输入法 mac版 编辑:程序博客网 时间:2024/06/03 10:01

CXF与Rest服务

    REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”。REST 这个术语是由 Roy Fielding 在他的博士论文 《 Architectural Styles and the Design of Network-based Software Architectures 》中提出的。REST 并非标准,而是一种开发 Web 应用的架构风格,可以将其理解为一种设计模式。REST 基于 HTTP,URI,以及 XML 这些现有的广泛流行的协议和标准,伴随着 REST,HTTP 协议得到了更加正确的使用。    基于 REST 的 Web 服务遵循一些基本的设计原则:
  • 系统中的每一个对象或是资源都可以通过一个唯一的 URI 来进行寻址,URI 的结构应该简单、可预测且易于理解,比如定义目录结构式的URI。
  • 以遵循 RFC-2616 所定义的协议的方式显式地使用 HTTP 方法,建立创建、检索、更新和删除(CRUD:Create,Retrieve, Update and Delete)操作与 HTTP 方法之间的一对一映射:
  • 若要在服务器上创建资源,应该使用 POST 方法;
  • 若要检索某个资源,应该使用 GET 方法;
  • 若要更改资源状态或对其进行更新,应该使用 PUT 方法;
  • 若要删除某个资源,应该使用 DELETE 方法。

例如:

GET /zoos:列出所有动物园POST /zoos:新建一个动物园GET /zoos/ID:获取某个指定动物园的信息PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)DELETE /zoos/ID:删除某个动物园GET /zoos/ID/animals:列出某个指定动物园的所有动物DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

1.在web.xml中添加cxfservlert

<servlet>        <servlet-name>CXFServlet</servlet-name>        <servlet-class>     org.apache.cxf.transport.servlet.CXFServlet        </servlet-class>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>CXFServlet</servlet-name>        <url-pattern>/service/*</url-pattern>    </servlet-mapping>

2.在编写service接口

package com.webservice.service;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.jws.WebParam;import javax.ws.rs.Consumes;import javax.ws.rs.GET;import javax.ws.rs.POST;import javax.ws.rs.PUT;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.webpos.dao1.WpStoreItemMapper;import com.webpos.vo.WpStoreItem;import com.webpos.vo.WpStoreItemExample;import com.webservice.dao.QueryStoreItemDao;import com.webservice.vo.RetStoreItem;//广易付 PC端商品添加修改查询 rest接口@Path("/")@Service("restStoreItemServer")public class RestStoreItem {    @Autowired    private QueryStoreItemDao storeItemDao;    @Autowired    private WpStoreItemMapper storeItemMapper;    @GET    @Path("storeItem")    @Produces({MediaType.APPLICATION_JSON})//返回的mime类型    @Consumes({MediaType.APPLICATION_JSON})//接受请求的mime类型    public RetStoreItem storeItem(){        List<Map<String, Object>> retList = new ArrayList<>();        List<WpStoreItem> list = storeItemDao.queryStoreItemParent();        if(list != null && list.size()>0){            for(int i = 0;i<list.size();i++){                long id = list.get(i).getId();                List<WpStoreItem> listItem = storeItemDao.queryStoreItem(id);                Map<String, Object> map = new HashMap<>();                map.put("parent", list.get(i).getItemName());                map.put("value", listItem);                retList.add(map);            }        }         RetStoreItem ret = new RetStoreItem();         ret.setList(retList);         ret.setFlag("success");         return ret;    }    @POST    @Path("/storeItem")    @Produces({MediaType.APPLICATION_JSON})    @Consumes({MediaType.APPLICATION_JSON})    public RetStoreItem addStoreItem(WpStoreItem item){        RetStoreItem ret = new RetStoreItem();        if(item != null){            if(item.getItemId() == null || item.getItemId().equals("")){                ret.setFlag("添加失败,商品编号不能为空");                return ret;            }            if(item.getItemName() == null || item.getItemName().equals("")){                ret.setFlag("添加失败,商品名称不能为空");                return ret;            }            if(item.getParentId() == null || item.getParentId().equals("")){                ret.setFlag("添加失败,商品种类不能为空");                return ret;            }            if(item.getItemPrice() == null || item.getItemPrice().equals("")){                ret.setFlag("添加失败,商品价格不能为空");                return ret;            }            storeItemMapper.insertSelective(item);            ret.setFlag("success");            return ret;        }        ret.setFlag("添加失败,商品信息不能为空");        return ret;    }    @GET    @Path("/storeItem/{id}")    @Produces({MediaType.APPLICATION_JSON})    @Consumes({MediaType.APPLICATION_JSON})    public RetStoreItem getStoreItemById(@PathParam("id") Long itemid){        RetStoreItem ret  = new RetStoreItem();        if(itemid != null){            WpStoreItemExample example = new WpStoreItemExample();            example.clear();            example.createCriteria().andIdEqualTo(itemid);            List<WpStoreItem> list = storeItemMapper.selectByExample(example);            List<Map<String, Object>> list1 = new ArrayList<>();            Map<String, Object> map = new HashMap<>();            map.put("value", list);            list1.add(map);            ret.setList(list1);            ret.setFlag("success");        }else{            ret.setFlag("修改失败,商品ID不能为空");        }        return ret;    }    @PUT    @Path("/storeItem/{id}")    @Produces({MediaType.APPLICATION_JSON})    @Consumes({MediaType.APPLICATION_JSON})    public RetStoreItem updateStoreItemById(@PathParam("id") Long itemid,@WebParam(name="WpStoreItem") WpStoreItem item){        RetStoreItem ret = new RetStoreItem();        if(itemid != null && item != null){            WpStoreItemExample example = new WpStoreItemExample();            example.clear();            example.createCriteria().andIdEqualTo(itemid);            storeItemMapper.updateByExampleSelective(item, example);            ret.setFlag("success");        }else{            ret.setFlag("修改失败,商品ID或者商品详情不能为空");        }        return ret;    }}

3.在Spring-context中添加bean-server

    <jaxrs:server  id="restServer" address="/rest">        <jaxrs:providers><!-- 提供json转Obejct Object需要添加注解@xmlRootElement-->                <bean id="jacksonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />        </jaxrs:providers>                  <jaxrs:serviceBeans>                <ref bean="restStoreItemServer" />        </jaxrs:serviceBeans>    </jaxrs:server>
0 0
原创粉丝点击