需求:
对传入的参数进行判断,部分字段可以为空,部分字段不可以为空。每个字段手动进行判断,太麻烦了。
解决方案:
利用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;
}
}