因为有两个接口返回的数据不是一致的,所以数据库表的创建是集合了这二者接口返回数据的并集,当从其中某一个接口取的数据时,不想每个字段都去set一下,所以有了以下的处理:
将针对这两个接口返回数据并集创建A数据库表,对应项目中的A类。
根据第一个接口(B)获取的数据,创建了项目中的AFromB类
A.java
import com.coocaa.base.AbstractItem; import com.coocaa.base.ItemBase; import com.coocaa.db.distributed.Level; import javax.persistence.*; @Entity @Table(name = "table_name") @Level(Level.TYPE.PRIVATE) @org.hibernate.annotations.Entity(dynamicUpdate=true,dynamicInsert=true) public class A extends AbstractItem implements ItemBase { /** * */ private static final long serialVersionUID = 1L; public A(){} @Column( name = "id" , nullable=false ,length = 8) @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column( name = "dev_mac" ,length = 100 ) private String devMac; @Column( name = "chip" ,length = 100 ) private String chip; public void setId( Integer id ) { this.id = id; } public Integer getId() { return this.id; } public void setDevMac( String devMac ) { this.devMac = devMac; } public String getDevMac() { return this.devMac; } public void setChip( String chip ) { this.chip = chip; } public String getChip() { return this.chip; } }
AFromB类:
package com.coocaa.app.device; import javax.persistence.Column; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class AFromB{ private String dev_mac; private String chip; public String getDev_mac() { return dev_mac; } public void setDev_mac(String dev_mac) { this.dev_mac = dev_mac; } public A toA() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException{ Class<?> aFromBClass = AFromB.class; Class<?> aClass = A.class; Field[] fields = a.getDeclaredFields(); A a= new A(); for (Field field : fields) { Column column = field.getAnnotation(Column.class);//获取注解 if (column==null){ continue; } Field fieldAFromB = null; try { fieldAFromB = aFromBClass.getDeclaredField(column.name());//获取带注解的name 比如获取的dev_mac而不是devMac } catch (NoSuchFieldException e) { //e.printStackTrace(); continue; } if (fieldAFromB!=null){ //从aFromB拿出来 String aFromBMethodName =fieldAFromB.getName().substring(0, 1).toUpperCase()+fieldAFromB.getName().substring(1); String getMethodName = "get"+aFromBMethodName; Method getMethod = aFromBClass.getMethod(getMethodName); //set到alass这里面去 String aMethodName = field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1); String setMethodName = "set"+devicMethodName; Method setMethod = aClass.getMethod(setMethodName,field.getType()); Object value = getMethod.invoke(this); setMethod.invoke(a,value); } } return a; } }
去接口获取时只需做如下操作:
AFromB aFromB = JacksonHelper.fromJSON(respone, AFromB .class);//AFromB里面的属性必须和返回的Json的名称一致,所以AFromB里面的属性都是小写的 A a= aFromB.toA();
这样就从把从B接口获取的获取直接 Set到A中,不用每个字段都去set,代码更加简洁 。