java Rest学习-第一个Java REST 服务(4)-扩展服务

文章标签: java-rest
2014-12-16 9:34:53     7 人阅读    

在Maven 原型示例的基础上进行模仿来扩展该项目的REST 服务接口是本节的第二个任务,通过这一过程实现对Jersey 使用的初步认识。下面我们要完成的任务是实现一个更新设备的API,这将包括开发设备实体类、资源类和逻辑分层类,然后对其进行测试,以检验我们的成果。
1. 增加设备实体类
资源类和逻辑分层类在图2-2 中已经展示,实体类是资源自身的信息,用于序列化和持久化资源。设备的实体类用于传输和持久化设备资源,设备的实体类命名为Device ,该类是一个最基本的POJO 类,包含两个属性,分别是设备的IP 和设备的状态。其代码示例如下。

//关注点1 :JAXB 根元素
@XmlRootElement(name = "device")
public class Device {
  private String deviceIp;
  private int deviceStatus;
  public Device() {
  }
  public Device(String deviceIp) {
      super();
      this.deviceIp = deviceIp;
  }
//关注点2 :JAXB 属性 @XmlAttribute
  public String getIp() {
      return deviceIp;
  }
  public void setIp(String deviceIp) {
      this.deviceIp = deviceIp;
  }
  @XmlAttribute
  public int getStatus() {
      return deviceStatus;
  }
  public void setStatus(int deviceStatus ) {
      this.deviceStatus = deviceStatus;
  }
}

该类标注了JAXB 标准定义的@XmlRootElement和@XmlAttribute注解,以便将Device 类和XML格式的设备数据相互转换并在服务器和客户端之间传输,见关注点 1 和关注点2 。
2. 增加设备资源类
创建了设备实体类后,我们需要一个资源类来公布设备的REST API。源代码中已经提供了资源类MyResource,为实现设备管理,我们模仿该类,创建设备资源类 DeviceResource,代码示例如下。
@Path("device" )
public class DeviceResource {
//关注点1 :注入Dao 实例
    private final DeviceDao deviceDao;
    public DeviceResource() {
        deviceDao = new DeviceDao();
    }
//关注点2 :GET 方法
    @GET    @Produces ({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
    public Device get (@QueryParam ("ip") final String deviceIp ) {
    Device result = null;
        if(deviceIp != null ) {
            result = deviceDao.getDevice(deviceIp );
        }
        return result;
    }
//关注点3 :PUT 方法
    @PUT
    @Produces ({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
    public Device put (final Device device ) {
        Device result = null;
        if(device != null) {
            result = deviceDao.updateDevice(device);
        }
        return result;
    }
}

在这段代码中,关注点2 中的GET 方法和2.1.2节定义的GET 方法作用相同,用于获取设备信息,输入参数deviceIp 是以设备IP 作为查询条件,输出是设备实体类的实例,其表述格式可以是JSON 或者XML。关注点3 是DeviceResource 类处理HTTP 协议的PUT 方法。put() 方法定义了两个注解,@PUT 是标识处理PUT 请求,@Produces是标识返回实体的类型,本例中同时支持JSON 格式和XML格式。细心的读者会质疑持久层Dao 类DeviceDao 的实例化是在资源类中完成的,见关注点1 ,可能会发现这不符合三层设计,也不符合IoC 。我们会在后续示例中逐渐做到更加严谨,这只是第一个入门例子,放轻松。3. 增加设备逻辑类本例演示了简单的分层结构,数据的持久化由DeviceDao 类完成,该类简单地模拟了设备持久化。其示例代码如下。
public class DeviceDao {
    ConcurrentHashMap<String, Device> fakeDB = new ConcurrentHashMap<>();
    public DeviceDao() {
    // 关注点1 :测试数据,初始化了两个设备实例
        fakeDB.put("10.11.58.163", new Device("10.11.58.163"));
        fakeDB.put("10.11.58.184", new Device("10.11.58.184"));
    }
    public Device getDevice(String ip) {
        return fakeDB.get(ip);
    }
    public Device updateDevice(Device device) {
        String ip = device.getIp();
        fakeDB.put(ip, device);
        return fakeDB.get(ip);
    }
}
在这段代码中,DeviceDao 类简单地使用HashMap 实现了内存级别的持久化。为了单元测试的需要,本例使用了硬编码的测试数据,持久层加载时,为测试环境初始化了两个设备实例,见关注点1 。这部分代码在实际项目的单元测试中,不要使用硬编码,可以使用内存数据库比如H2、Derby 等替换;在集成环境中,应使用真实的数据库进行替换。


原文地址:http://www.itmmd.com/201412/323.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

Java程序常用算法 - 将数字格式化为货币字符串   上一篇
下一篇  模仿你并超越你!!抓住一次机会毁掉你!!

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!