应用场景
实际开发中,经常遇到如下场景
随着用户下拉列表选项不同,传递给后台的参数的name及value都不相同,此时可以先将前端的参数封装成通用的查询对象QueryBean,然后在后台再将这个查询对象封装成具体的查询对象,比如UserQuery。这个转换操作可以通过下面的工具实现,不用再一个个的编写代码实现了。
待转换的参数类@Getter
@Setter
@Builder
@ToString
public class QueryBean {
/**
* 查询条件
*/
private String queryKey;
/**
* 查询的具体值
*/
private String queryValue;
private String startDate;
private String endDate;
}
需要转换到的目标类
@Getter
@Setter
@ToString
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AddressQuery {
/**
* 编号
*/
private Long id;
/**
* 收货人姓名
*/
private String receiver;
/**
* 具体地址
*/
private String addr;
/**
* 邮编
*/
private String postcode;
/**
* 电话
*/
private String tel;
/**
* 用户编号
*/
private Long userId;
/**
* 状态
*/
private Integer status;
/**
* 开始时间
*/
private LocalDate startDate;
/**
* 结束时间
*/
private LocalDate endDate;
}
转换工具类
public class QueryBean2DomainBeanQueryUtil {
/**
* 将QueryBean对象转换成项目中实体类对应的查询对象
* @param queryBean 用来封装前端页面传递过来的参数
* @param obj 实体类对应的查询对象
* @throws Exception
*/
public void trans(QueryBean queryBean, Object obj) throws Exception {
// 处理实体类查询对象中的LocalDate类型的字段:startDate和endDate
String startDateStr = queryBean.getStartDate();
LocalDate startDate = null;
if (StringUtils.hasText(startDateStr)) {
startDate = DateTimeUtil.strDate2LocalDate(startDateStr);
}
String endDateStr = queryBean.getEndDate();
LocalDate endDate = null;
if (StringUtils.hasText(endDateStr)) {
endDate = DateTimeUtil.strDate2LocalDate(endDateStr);
}
//获取封装了的请求信息,比如:key="area" value="华夏大道"
String key = queryBean.getQueryKey();
String value = queryBean.getQueryValue();
//具体转换
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass(), Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String name = pd.getName();
Method writeMethod = pd.getWriteMethod();
Class[] parameterTypes = writeMethod.getParameterTypes();
String paramType = parameterTypes[0].getSimpleName();
System.out.println(name+" "+writeMethod+" "+paramType);
if (startDate != null && endDate != null) {
if(name.equals("startDate") ){
writeMethod.invoke(obj,startDate);
} else if(name.equals("endDate") ){
writeMethod.invoke(obj,endDate);
}
continue;
}
if (name.equals(key)) {
switch (paramType) {
case "Integer":
writeMethod.invoke(obj, Integer.valueOf(value));
break;
case "Long":
writeMethod.invoke(obj, Long.valueOf(value));
break;
//TODO:根据目标查询类的字段添加相应的类型转换
default:
//处理字符串类型
writeMethod.invoke(obj,value);
}
}
}
}
}
测试代码
public static void main(String[] args) throws Exception {
QueryBean queryBean = QueryBean.builder()
.queryKey("addr")
.queryValue("华夏大道")
.startDate("1999-09-21")
.endDate("2000-11-11")
.build();
OrderQuery orderQuery = new OrderQuery();
QueryBean2DomainBeanQueryUtil obj = new QueryBean2DomainBeanQueryUtil();
obj.trans(queryBean, orderQuery);
System.out.println(orderQuery);
}