您当前的位置: 首页 > 

梁云亮

暂无认证

  • 2浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

将封网页传递过来的通用查询对象转换成具体的查询对象

梁云亮 发布时间:2022-05-29 09:53:56 ,浏览量:2

应用场景

实际开发中,经常遇到如下场景 在这里插入图片描述 在这里插入图片描述

随着用户下拉列表选项不同,传递给后台的参数的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);
}
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0398s