北京公交,虚怀若谷,燕麦片怎么吃-雷竞技app_雷竞技app官网

频道:小编推荐 日期: 浏览:138

布景

在开发中常常需求写一些字段校验的代码,比方非空,长度约束,邮箱格局验证等等,导致充满了if-else 的代码,不只适当冗长,并且很让人抓狂。

hibernate validator(官方文档)供给了一套比较完善、快捷的验证完结方法。它界说了许多常用的校验注解,咱们能够直接将这些注解加在咱们JavaBean的特点上面,就能够在需求校验的时分进行校验了。在Spring Boot 炽热的现在,该东西现已包括在spring-boot-starter-web中,不需额定引进其他包。

一、快速入门

1.1 在UserDTO中声明要查看的参数

校验阐明见代码中注释

1.2 接口处声明要查看的参数

需求在Controller层的入参方位用@Validated 注解声明

这儿的HttpResult 是滕砹Van 自己封装的一个成果集,详见文末Github地址的源码。

1.3 We咱们成婚了20140111b大局反常捕获

@Valid 在 Spring Boot中进行绑定参数校验时会抛出反常,需求在Spring Boot中处理。

1.4 测验

测验东西选用的postman

  • 恳求方法:POST
  • 恳求地址:localhost:8080/demo/test
  • 恳求参数:

  • 回来成果:

  • 阐明
  1. 更多注解,请各位自行测验;
  2. 测验成果证明:参数校验收效,且依照咱们设定的成果集回来反常信息。

1.5 常见的校验注解

  1. @Null:被注释的元素有必要为 null
  2. @NotNull:被注释的元素有必要不为 null
  3. @AssertTrue:被注释的元素有必要为 true
  4. @AssertFalse:被注释的元素有必要为 false
  5. @Min(value):被注释的元素有必要是一个数字,其值有必要大于等于指定的最小值
  6. @Max(value):被注释的元素有必要是一个数字,其值有必要小于等于指定的最大值
  7. @DecimalMin(value):被注释的元素有必要是一个数字,其值有必要大于等于指定的最小值
  8. @DecimalMax(value):被注释的元素有必要是一个数字,其值有必要小于等于指定的最大值
  9. @Size(max=, min=):被注释的元素的巨细有必要在指定的范围内
  10. @Digits (integer, fraction):被注释的元素有必要是一个数字,其尔后不再爱你值有必要在可接受的范围内
  11. @Past:被注释的元素有必要是一个曩昔的日期
  12. @Future:被注释的元素有必要是一个将来的日期
  13. @Pattern(regex=,flag=):被注释的元素有必要契合指定的正则表达式
  14. @NotBlank(message =):验证字符串非null,且长度有必要大于0
  15. @Email:被注释的元素有必要是电子邮箱地址
  16. @Length(min=,max=):被注释的字符串的巨细有必要在指定的范围内
  17. @NotEmpty:被注释的字符串的有必要非空
  18. @Range(min=,max=,message=):被注释的元素有必要在适宜的范围内

二、自界说注解校验

hibernate validator 自带的注解能够搞定简略的参数校验,加上正则的写法撞邪31号,能处理绝大多数参数校验状况。可是,有些状况,比徐小迪腹语如:校验是否登录,就需求咱们自界说注一路歌唱柔力球解校验了。为了便利测验,我这儿以身份证校验为例完结自界说校验的进程。

2.1 身份证校验东西类

public class IdCardValidatorUtils {
protected String codeAndCity[][] = {{"11", "北京"}, {"12", "天津"},
{"13", "河北"}, {"14", "山西"}, {"15", "内蒙古"}, {"21", "辽宁"},
{"22", "吉林"}, {"23", "黑龙江"}, {"31", "上海"}, {"32", "江苏"},
{"33", "浙江"}, {"34", "安徽"}, {"35", "福建"}, {"36", "江西"},
{"37", "山东"}, {"41", "河南"}, {"42", "湖北"}, {"43", "湖南"},
{"44", "广东"}, {"45", "广西"}, {"46", "海南"}, {"50", "重庆"},
{"51", "四川"}, {"52", "贵州"}, {"53", "云南"}, {"54", "西藏"},
{"61", "陕西"}, {"62", "甘肃"}, {"63", "青海"}, {"64", "宁夏"},
{"65", "新疆"}, {"71", "台湾"}, {"81", "香港"}, {"82", "澳门"},
{"91", "国外"}};
private String cityCode[] = {"11", "12", "13", "14", "15", "21", "22",
"23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",
"44", "45", "46", "50", "51", "52", "53", "54"苏婧荣西决免费阅览, "61", "62", "63",
"64", "65", "71", "81", "82", "91"};
// 每位加权因子
private static int 合肥肥东气候power[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 第18位校检码
private String verifyCode[] = {"1", "0何超琼现任老公俞铮", "X", "9", "8", "7", "6", "5",
"4", "3", "2"};
/**
* 验证一切的身份证的合法性
*
* @param idcard
* @return
*/
public static boolean isValidatedAllIdcard(String idcard) {
if (idcard.length() == 15) {
idcard = convertIdcarBy15bit(idcard);
}
return isValidate18Id北京公交,不耻下问,燕麦片怎样吃-雷竞技app_雷竞技app官网card(idcard);
}
/**
* 将15位的身份证转成18位身份证
*
* @param idcard
* @return
*/
public s李曼嘉tatic为卿狂 String convertIdcarBy15bit(String idcard) {
String idcard17 = null;
// 非15位身份证
if (idcard.length() != 15) {
return null;
}
if (isDigita韩颖玥l(idcard)) {
// 获取出世年月日
String birthday = idcard.substring(6, 12);
Date birthdate = null;
try {
birthdate = new SimpleDateFormat("yyMMdd").parse(birthday);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cday = Calenda平波市r.getInstance();
cday.setTime(birthdate);
String year = String.valueOf(cday.get(Calendar.YEAR));
idcard17 = idcard.substring(0, 6) + year + idcard.substring(8);
char c[] = idcard17.toCharArray();
String checkCode = "";
if (null != c) {
int bit[] = new int[idcard17.length()]莎菲宝;
// 将字符数组转为整型数组
bit = converCharToInt(c);
int sum17 = 0;
sum17李小幼 = getPstringendoowerSum(bit);
// 获取和值与1北京公交,不耻下问,燕麦片怎样吃-雷竞技app_雷竞技app官网1取模得到余数进行校验码
checkCode = getCheckCodeBySum(sum17);
// 获取不到校验位
if (null == checkCode) {
return null;
}
// 将前17位与第18位校验码拼接
idcard17 += checkCode;
}
} else { // 身份证包括污漫画图片数字
return null;
}
return idcard17;
}
/**
* @param idCard
* @return
*/
public static boolean isValidate18Idcard(String idCard) {
// 非18位为假
if (idCard.北京公交,不耻下问,燕麦片怎样吃-雷竞技app_雷竞技app官网length() != 18) {
return false;
}
// 获取前17位
String idcard17 = idCard.substring(0, 17);
// 获取第18位
String idcard18Code = idCard.substring(17, 18);
char c[] = null;
String checkCode = "";
// 是否都为数字
if (isDigital(idcard17)) {
c = idcard17.toCharArray();
} else {
return false;
}
if (null != c) {
int bit[北京公交,不耻下问,燕麦片怎样吃-雷竞技app_雷竞技app官网] = new int[idcard17.length()];
bit = converCharToInt(c);
int sum17 = 0;
sum17 = getPowerSum(bit);
// 将和值与11取模得到余数进行校验码判别
checkCode = getCheckCodeBySum(sum17);
if (null == checkCode) {
return false;
}
// 将身份证的第18位与算出来的校码进行匹配,不相等就为假
if (!idcard18Code.equalsIgnoreCase(checkCode)) {
return false;
}
}
return true;
}
/**
* 18位身份证号码的根本数字和位数验校
*
* @param idCard
* @return
*/
public boolean is18Idcard(String idCard) {
return Pattern.matches("^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$", idCard);
}
/**
* 数字验证
*北京公交,不耻下问,燕麦片怎样吃-雷竞技app_雷竞技app官网
* @param str
* @return
*/
public static boolean isDigital(String str) {
return str == null || "".equals(str) ? false : s北京公交,不耻下问,燕麦片怎样吃-雷竞技app_雷竞技app官网tr.matches("^[0-9]*$");
}
/**
* 将身份证的每位和对应位的加权因子相乘之后,再得到和值
*
* @param bit
* @return
*/
pub北京公交,不耻下问,燕麦片怎样吃-雷竞技app_雷竞技app官网lic static int getPowerSum(int[] bit) {
int sum = 0;
if (power.length != bit.length) {
return sum;
}
for (int i = 0; i < bit.length; i++) {
for (int j = 0; j < power.length; j++) {
if (i == j) {
sum = sum + bit[i] * power[j];
}
}
}
return sum;
}
/**
* 将和值与11取模得到余数进行校验码判别
*
* @param sum17
* @return 校验位
*/
public static String getCheckCodeBySum(int sum17) {
String checkCode = null;
switch (sum17 % 11) {
case 10:
checkCode = "2";
break;
case 9:
checkCode = "3";
break;
case 8:
checkCode = "4";
break;
case 7:
checkCode = "5";
break;
case 6:
checkCode = "6";
break;
case 5:
checkCode = "7";
break;
case 4:
checkCode = "8";
break;
case 3:
checkCode = "9";
break;
case 2:
checkCode = "x";
break;
于文华与尹相杰睡觉case 1:
checkCode = "0";
break;
case 0:
checkCode = "1";
break;
}
return checkCode;
}
/**
* 将字符数组转为整型数组
*
* @param c
* @return
* @throws NumberFormatException
*/
public static int[] converCharToInt(char[] c) throws NumberFormatException {
int[] a = new int[c.length];
int k = 0;
for (char temp : c) {
a[k++] = Integer.parseInt(String.valueOf(temp));
}
return a;
}
public static void main(String[] args) {
String idCardForFalse = "350583199108290106";
String idCardForTrue = "350583197106150219";
if (IdCardValidatorUtils.isValidatedAllIdcard(idCardForTrue)) {
System.out.println("身份证校验正确");
} else {
System.out.println("身份证校验过错!");
}
}
}

2.2 自界说注解

细心的你会发现,相对于一般的自界说注解,该注解:

@Constraint(validatedBy = IdentityCardNumberValidator.class),该注解的效果便是调用身份证校验的东西。

2.3 在UserDTO 需求校验的字段增加声明

2.4 操控层接口

2.5 自界说注解的测验

  • 恳求方法:POST
  • 恳求地址:localhost:8080/private/test
  • 恳求参数:

  • 回来成果:

三、分组校验

除了上述的校验外,或许还361vpn有这种需求:

在创立用户信息时,不需求校验userId;但在更新用户信息时,需求校验userId,而用户名,邮箱等两种状况都得校验。这种状况,就能够分组校验来处理了。

3.1 界说分组接口

  • Create.java

  • Update.java

3.2 在UserDTO 需求校验的字段增加声明

3.3 操控层入参方位进行声明

3.4 分组校验的测验-新增测验

  • 恳求方法:POST
  • 恳求地址:localhost:8080/groups/create
  • 恳求参数:

  • 回来成果:

恳求成功,阐明新增恳求,不查验userId,即userId能够为空。

3.5 分组校验的测验-更新测验

  • 恳求方法:POST
  • 恳求地址:localhost:8080/groups/update
  • 恳求参数:同上(3.4)
  • 回来成果:

恳求失利,阐明更新恳求,查验userId,即userId不能为空。

结合 3.4 与 3.5 的测验成果,阐明分组校验成功。

四、总结

期望我们写的每一行代码都是事务需求,而不是无聊且无穷无尽的参数校验。

千山万壑总是情,点个重视行不行~