利用反射进行参数校验的工具类

参数校验工具类

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值