使用java反射判断实体类中属性是否为空

1,046 阅读1分钟

需求:

对传入的参数进行判断,部分字段可以为空,部分字段不可以为空。每个字段手动进行判断,太麻烦了。

解决方案:

利用java的反射,判断参数是否为空。

请求参数
@Data
public class MsgRuleLabelReq {

    @RequiredParam(isCanBeBlank = true)
    private String labelName;
    private Integer age;
    private List<MsgRuleItem> items;

    @Data
    public static class MsgRuleItem {
        private String argument;//条件名
        private String comparator;//约束条件
        private String value;//约束值
    }
}
自定义注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiredParam {
    boolean isCanBeBlank() default false;//是否可以为空
}
具体实现
@Slf4j
public class ObjectUtils {

    /**
     * 判断实体类中属性是否为空
     * 
     * @author chilei
     * @param object
     * @return
     */
    public static boolean checkObjFieldIsBlank(Object object) {
        boolean flag = false;
        if (null != object) {
            try {
                for (Field field : object.getClass().getDeclaredFields()) {
                    field.setAccessible(true);//在用反射时访问私有变量(private修饰变量)
                    RequiredParam annotation = field.getAnnotation(RequiredParam.class);
                    if (annotation != null && annotation.isCanBeBlank()) {
                        continue;
                    }
                    if (field.getType().equals(List.class)) {
                        Object o = field.get(object);
                        if (o instanceof List) {//如果有集合,循环调用
                            int size = ((List<?>) o).size();
                            for (int i = 0; i < size; i++) {
                                Object o1 = ((List<?>) o).get(i);
                                flag = checkObjFieldIsBlank(o1);
                            }
                        }
                    } else {
                        if (field.get(object) == null || StringUtils.isBlank(field.get(object).toString())) {
                            flag = true;
                        }
                    }
                }
            } catch (IllegalAccessException e) {
                log.error("校验实体类属性失败:{}", e.getMessage());
                throw new RuntimeException();
            }
        }
        return flag;
    }
}