参数校验工具类
1. 源码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
/**
* @description: 校验请求参数的工具类
**/
public class CheckRequestDtoUtil {
private final Logger logger = LoggerFactory.getLogger(CheckRequestDtoUtil.class);
//选填列表 (不需要校验的参数)
private Set<String> notRequiredParamList = new HashSet<>();
//参数是否通过校验
private boolean success = true;
//错误信息
private String errorMessage;
//管理用到的字符串
private String requiredParamNote = "required parameter :";
private String stringTypeName="class java.lang.String";
private String requestDtoIsNull = "请求报文为空!";
private String isNullStr = "缺失";
private String isEmptyStr = "为空";
//检测参数是否全部不为空,全部不为空返回 true 否则 返回 false
public boolean checkRequestDto(Object requestDto) {
StringBuilder result = new StringBuilder(requiredParamNote);
if (requestDto == null) {
this.setSuccess(false);
this.setErrorMessage(requestDtoIsNull);
return this.isSuccess();
}
try {
Class<?> clz = requestDto.getClass();
Field[] fields = clz.getDeclaredFields();
//检查每一个属性
for (Field field : fields) {
//属性是否在选填列表,在则不需要校验,跳过
if (notRequiredParamList.contains(field.getName())) {
continue;
}
Method m = null;
//通过get方法取值
m = requestDto.getClass().getMethod(
"get" + getMethodName(field.getName()));
Object val = m.invoke(requestDto);// 调用getter方法获取属性值
//检查参数是否为空,如果参数为null,返回false与错误提示
if (val == null) {
result = paramIsNull(result,field);
}
else if (field.getType().toString().equals(stringTypeName)) {//如果是字符串类型
String valTemp = (String)val ;
valTemp = valTemp.replaceAll(" ", "");//去空格
if ("".equals(valTemp)) {
result = paramIsEmpty(result,field);
}
}
}
} catch (Exception e) {
logger.error("checkRequestDto error {}", e);
}
if (!isSuccess()) {
this.setErrorMessage(String.valueOf(result));
}
return this.isSuccess();
}
// 把一个字符串的第一个字母大写、效率是最高的
private String getMethodName(String fildeName) {
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
//参数为空返回提示
private StringBuilder paramIsEmpty(StringBuilder result,Field field){
this.setSuccess(false);
result.append(" ").append(field.getName()).append(isEmptyStr);
return result;
}
//参数为null返回提示
private StringBuilder paramIsNull(StringBuilder result,Field field){
this.setSuccess(false);
result = result.append(" ").append(field.getName()).append(isNullStr);
return result;
}
//增加选填参数,即不校验的参数。返回本身以便连续添加
public CheckRequestDtoUtil addNotRequiredParam(String param) {
this.notRequiredParamList.add(param);
return this;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
2.使用
CheckRequestDtoUtil checkRequestDtoUtil = new CheckRequestDtoUtil();
checkRequestDtoUtil.addNotRequiredParam("cityCode")
.addNotRequiredParam("contactName")
.addNotRequiredParam("contactPhone")
.addNotRequiredParam("monthlyCardNo")
.addNotRequiredParam("provinceCityAddress");
if (!checkRequestDtoUtil.checkRequestDto(commonAddress)) {
result.setErrorMessage(checkRequestDtoUtil.getErrorMessage());
return result;
}
3.结果
{
"errorMessage": "required parameter : code缺失",
"success": false
}
版权声明:本文为qq_34113107原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。