java中常⽤的参数校验⽅法
欢迎访问个⼈博客
在对外开放接⼝的时候,我们每次需要对调⽤者传进来的参数进⾏校验,对于少量并且参数简单的接⼝,我们完全可以⽤最原始的⽅法进⾏校验。⽐如:
public User selectUser(User user) {
log.info("[查询⽤户信息],请求参数:{}", JSONString(user));
// 参数校验(性别⽤户名地址⽤户状态等)
if(StringUtils.Sex()) && StringUtils.Address()) && StringUtils.Statu())){
//当校验通过的时候执⾏后⾯的逻辑
return user;  // 查询数据库返回的⽤户信息
}else {
param namelog.info("参数校验未通过,请确认请求参数并重试");
return null;
}
}
但是,当有很多个接⼝需要对外开放,并且每个接⼝都有很多的字段,如果还⽤上⾯的校验⽅法的话,显然是不够合理的。那最好的解决办法就是把最常见的参数校验做成⼀个公共的⽅法,这样每个接⼝都不必写重复的校验⽅法。避免了⼤量的重复代码。
常见的参数校验主要校验的信息⽐如:
①空或长度 ②⾮空且长度 ③空或数字长度 ④⾮空且数字长度 等等
下⾯列举出⼀些常⽤的参数校验⽅法:
在此之前,⼀定要引⼊:
<dependency>
<groupId>org.apachemons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
部分⽤到的正则表达式:
private static String REQ_EX_Amt = "^(?!0\\.00)(0|[1-9][0-9]*)[\\.][0-9]{2}$";
private static Pattern PATTERN_AMT = Patternpile(REQ_EX_Amt);
private final static String NUMERIC_REGEX = "^[0-9]+$";
private static Pattern PATTERN_NUMERIC = Patternpile(NUMERIC_REGEX);
private final static String NUMERIC_ALPHABET_REGEX = "^[a-zA-Z0-9]+$";
private static Pattern PATTERN_NUMERIC_ALPHABET = Patternpile(NUMERIC_ALPHABET_REGEX);
1、空或长度
public static void checkParamNullOrLength(String param, int length, String paramName, boolean isFixed) {
if (StringUtils.isEmpty(param)) {
return;
} else {
if (isFixed) {
checkRequestParam(StringUtils.length(param) == length, String.format("%s长度需为%d位", paramName, length));
} else {
checkRequestParam(StringUtils.length(param) <= length, String.format("%s最⼤长度为%d位", paramName, length));
}
}
}
2、⾮空且长度
public static void checkParamLength(String param, int length, String paramName, boolean isFixed) {
checkRequestParam(StringUtils.isNotEmpty(param), String.format("%s为空", paramName));
if (isFixed) {
checkRequestParam(StringUtils.length(param) == length, String.format("%s长度需为%d位", paramName, length));
} else {
checkRequestParam(StringUtils.length(param) <= length, String.format("%s最⼤长度为%d位", paramName, length));
}
}
3、空或数字长度
public static void checkParamNullOrNumeric(String param, int length, String paramName, boolean isFixed) {
if (StringUtils.isEmpty(param)) {
return;
} else {
checkParamNumeric(param, length, paramName, isFixed);
}
}
4、⾮空且数字长度
public static void checkParamNumeric(String param, int length, String paramName, boolean isFixed) {
checkParamLength(param, length, paramName, isFixed);
Matcher matcherNumeric = PATTERN_NUMERIC.matcher(param);
if (!matcherNumeric.matches()) {
throw new BizException(TopqurSubRespEnum.Code(), String.format("%s需为数字", paramName));
}
}
5、空或数字字母长度
public static void checkParamNullOrNumericOrAlphabet(String param, int length, String paramName, boolean isFixed) {
if (StringUtils.isEmpty(param)) {
return;
} else {
checkParamNumericOrAlphabet(param, length, paramName, isFixed);
}
}
6、⾮空且数字字母长度
public static void checkParamNumericOrAlphabet(String param, int length, String paramName, boolean isFixed) {
checkParamLength(param, length, paramName, isFixed);
Matcher matcherNumericAlphabet = PATTERN_NUMERIC_ALPHABET.matcher(param);
if (!matcherNumericAlphabet.matches()) {
throw new BizException(TopqurSubRespEnum.Code(), String.format("%s需为数字字母", paramName));        }
}
7、⾦额校验
public static void checkRequestParamAmt(String name, String amount) {
Matcher matcherFeeAmt = PATTERN_AMT.matcher(amount);
if (!matcherFeeAmt.matches()) {
throw new BizException(TopqurSubRespEnum.Code(),
name + "⾦额格式不正确");
}
}
8、校验多个字段同时为空或不为空
public static final String ALL_NULL = "ALL_NULL";
public static final String ALL_NOT_NULL = "ALL_NOT_NULL";
public static final String MIXED = "MIXED";
public static String value) {
String type = ALL_NOT_NULL;
if (StringUtils.isEmpty(value[0])) {
type = ALL_NULL;
}
for (int i = 1; i < value.length; i++) {
if (ALL_NULL.equals(type) && StringUtils.isNotEmpty(value[i])) {
return MIXED;
} else if (ALL_NOT_NULL.equals(type) && StringUtils.isEmpty(value[i])) {
return MIXED;
}
}
return type;
}
有了上⾯的共⽤校验参数,就可以在代码中像下⾯代码⼀样去使⽤他们进⾏参数校验了:
@Override
public void doTask() {
TransQueryReqBO reqBO = 调⽤者传⼊的请求参数();
ProductId(), 32, "product_id", false);
Version(), 10, "version", false);
checkRequestParam(DateUtils.ReqDate()), "req_date格式错误");        checkParamLength(reqBO.字段1(), 32, "字段名称", false);
ReqDate(), 8, "req_date", true);
ReqSeqId(), 128, "req_seq_id", false);
PartyOrderId(), 64, "party_order_id", false);
OutTransId(), 64, "out_trans_id", false);
checkRequestParam(!ALL_NULL.equals(ReqSeqId(),                OutTransId(), PartyOrderId())),
"req_seq_id、party_order_id、out_trans_id ⾄少填⼀");
}
这样看起来,整个参数校验就整齐⼲净了很多。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。