非空参数校验的工具类

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

自己在写代码的时候,一般都是先对入参进行校验,经常会写如下这种代码(日志打印非常重要,BusinessException是我自己定义的异常

if (StringUtils.isBlank(userId)) {
            LOGGER.warn("【参数userId为空】");
            throw new BusinessException(ErrorCode.NULL_ARGUMENT, "参数userId为空");
        }
        if (StringUtils.isBlank(oldPassword)) {
            LOGGER.warn("【参数oldPassword为空】");
            throw new BusinessException(ErrorCode.NULL_ARGUMENT, "参数oldPassword为空");
        }
        if (StringUtils.isBlank(newPassword)) {
            LOGGER.warn("【参数newPassword为空】");
            throw new BusinessException(ErrorCode.NULL_ARGUMENT, "参数newPassword为空");
        }

按照上面的写法其实没有错,但是会增加代码量,会有一点影响可读性,所以今天就写了一个公用的非空参数校验(草版,目前写得比较简陋,而且只支持非空校验)。

VadidatorUtils.java:

/**
 * 
 */
package com.hpe.core.utils;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;


/**
 * 校验工具类
 * @author luolin
 *
 * @version $id:VadidatorUtils.java,v 0.1 2016年1月15日 下午4:34:43 luolin Exp $
 */
public class ValidatorUtils {
    /** 日志 */
    private static final Logger LOGGER = Logger.getLogger(ValidatorUtils.class);

    /**
     * 参数为空校验
     * @param logger {@link Logger}
     * @param params 要校验的参数数组
     * @param paramNames 和参数数组匹配的形参的名字,用于打印日志
     * @Author : luolin. create at 2016年1月15日 下午4:55:30
     */
    @SuppressWarnings("rawtypes")
    public static void notNullParam(Object[] params, String[] paramNames) {
        LOGGER.info("【参数非空校验】");
        if (ArrayUtils.isEmpty(params) || ArrayUtils.isEmpty(paramNames)) {
            LOGGER.info("【没有需要校验的参数】");
            return;
        }
        StringBuffer message = new StringBuffer();
        int nullParamIndex = -1;
        for (int i = 0, len = params.length; i < len; i++) {
            
            if (params[i] == null) {
                nullParamIndex = i;
                break;
            }
            if (params[i] instanceof String) {
                if (StringUtils.isBlank((String) params[i])) {
                    nullParamIndex = i;
                    break;
                }
                continue;
            } else if (params[i] instanceof List) {
                if (CollectionUtils.isEmpty((Collection) params[i])) {
                    nullParamIndex = i;
                    break;
                }
                continue;
            } else if (params[i].getClass().isArray()) {
                if (ArrayUtils.isEmpty((Object[]) params[i])) {
                    nullParamIndex = i;
                    break;
                }
                continue;
            } else if (params[i] instanceof Map) {
                if (MapUtils.isEmpty((Map) params[i])) {
                    nullParamIndex = i;
                    break;
                }
                continue;
            }
        }
        if (nullParamIndex < 0) {
            return;
        }
        message.append(String.format("【参数%s为空】", paramNames[nullParamIndex]));
        LOGGER.warn(message);
        throw new NullArgumentException(paramNames[nullParamIndex]);
    }
}

调用方式如下,参数校验不通过会抛出异常,需要自己处理,我使用的spring mvc的统一异常处理

ValidatorUtils.notNullParam(new String[] { userId, oldPassword, newPassword }, new String[] { "userId", "oldPassword", "newPassword" });



本来我是想把方法定义成下面这样

public static void notNullParam(Object... param) {
        // TODO
    }

然后看是否能够通过反射,得到形参的名字,结果找了些方法,不太理想,所以暂时将方法定义成需要传入形参名字(以便打印日志),以后有时间再仔细研究下获得形参的方法。

Fighting.




转载于:https://my.oschina.net/simpleton/blog/603362

你可能感兴趣的:(非空参数校验的工具类)