最近项目在写对外接口,对方使用http请求访问,此时接口字段的校验成为一个问题,字段很多,单个校验非常的麻烦,用springmvc自带的注解校验又达不到提示作用,不是很友好,所有写了一个工具类用来批量校验字段。
package com.zqsign.app.privatearbitrate.util;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.FatalBeanException;
import com.zqsign.common.utils.StringUtil;
/**
* @ClassName: ValidateUtil
* @Description: TODO(这里用一句话描述这个类的作用)
* @author shidebin
* @date 2019年1月18日
*
*/
public class ValidateUtil {
//整个类都校验
public static List<String> validateProperty(Object validateObj) {
return validateProperty(validateObj,(String[])null);
}
//类中的某些字段不校验
public static List<String> validateProperty(Object validateObj,String... ignoreProperties) {
PropertyDescriptor[] targetPds = BeanUtils.getPropertyDescriptors(validateObj.getClass());
List<String> ignoreList = (ignoreProperties != null ? Arrays.asList(ignoreProperties) : null);
List<String> errList = new ArrayList<>();
for (PropertyDescriptor targetPd : targetPds) {
Method readMethod = targetPd.getReadMethod();
if (readMethod != null && (ignoreList == null || !ignoreList.contains(targetPd.getName()))) {
try {
if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
readMethod.setAccessible(true);
}
Object value = readMethod.invoke(validateObj);
if (value instanceof String) {
if (StringUtil.isEmpty((String) value)) {
errList.add(validateObj.getClass().getSimpleName()+ "中的" + targetPd.getName() + "不能为空");
continue;
}
}
if (value == null) {
errList.add(validateObj.getClass().getSimpleName() + "中的" + targetPd.getName() + "不能为空");
}
} catch (Throwable ex) {
throw new FatalBeanException(
"Could not copy property '" + targetPd.getName() + "' from source to target", ex);
}
}
}
return errList;
}
}
利用到spring中的类:
org.springframework.beans.BeanUtils
java.beans.PropertyDescriptor
说明:主要实现了俩个方法:
1.整个类的字段都校验
2.类中的某些方法不校验。
运行结果:
接口反馈信息:{"code":10000,"msg":"[\"Litigants中的name不能为空\"]"}