2019独角兽企业重金招聘Python工程师标准>>>
自己在写代码的时候,一般都是先对入参进行校验,经常会写如下这种代码(日志打印非常重要,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.