最近在工作中遇到了这种的需求
在一个视频页面,要通过websocket实时保存很多数据,但是数据的字段类型不一致(如果订单号是String,客户id是Long,客户下单的时间是Date),
1、前端每修改一个数据(每次只会传过来一个数据),就会发送信令通知到后端,保存进数据库。
2、最后还要在关闭页面时,发送所有数据到后端,再统一做一次保存。
对于这样的场景,就无法通过固定类型去接收参数,于是采用了反射的方式来处理,下面上代码
思路:
1、首先,我把所有前端会传过来的值,全部写在一个dto中,并和前端约定好,传过来数据的key,和我dto中的属性名保存一致。
2、前端传值时,因为我们不知道他这次传的是单个值,还是所有值,所以我们要先遍历整个dto,拿到所有value不为空的属性值,装入map
3、再判断他是订单类的数据,还是客户类的数据,装进相应的dto,保存数据库。
//service层代码
public void saveInfo(SaveInfoReq req){
//处理前端传过来的数据,装入map
Map<String,Object> paramMap = dealParam(req);
//待保存的数据
Order order = new order();
Customer cus = new Customer();
Set<String> keySet = param.keySet();
for(String key : keySet){
switch(key){
case "orderNo":case "type":case "createTime":
setMethod(order,key,paramMap.get(key));
case "id":case "sex":case "name":
setMethod(cus,key,paramMap.get(key));
}
}
}
private Map<String,Object> dealParam(SaveInfoReq req){
Map<String,Object> paramMap = new HashMap<>();
Field[] fields = req.getClass().getDeclaredFields();
for(Field field : fields){
String name = field.getName();//获取属性名
String type = field.getType().toString();//获取属性类型
Object valueObject = getValue(name,req);//获取属性值
String value = String.valueOf(valueObject);
if(null != valueObject){//如果valueObject 不为空,则装入map
log.info("name:{},type:{},value:{}",name,type,value);
paramMap.put(name,valueObject)
}
}
return paramMap;
}
//name是该属性的名字
private Object getValue(String name,SaveInfoReq req){
String getter = "get" + name.substring(0,1).toUpperCase() + name.substring(1);
try{
//获取name属性的get方法
Method getMethod = req.getClass().getMethod(getter ,new Class[]{name.getClass()});
Object value = getMethod.invoke(req,new Object[]{});
return value;
} catch (Exception e){
log.error("{}属性获取value值失败",name)
e.printStachTrace();
}
}
//target是存入数据库的dto,name是该属性的名字,source是前端传过来的值(由于要兼容传过来的不同类,所以用object)
private void setMethod(Object target,String name,Object source){
String setter = "set" + name.substring(0,1).toUpperCase() + name.substring(1);
try{
//获取name属性的set方法
Method setMethod = target.getClass().getMethod(setter,new Class[]{name.getClass()});
if(target instanceof Order){
//这个值是订单类,保存到订单表
Order order = (Order)target;
setMethod.invoke(order,source);
orderMapper.insert(order);
} else(target instanceof Order){
//这个值是客户类的,保存到客户表
Customer customer = (Customer)target;
setMethod.invoke(customer,source);
customerMapper.insert(customer);
}
} catch (Exception e){
e.printStachTrace();
}
}