1.需求背景
有一个需求,在前端传过来的时间格式的字符串进行校验,是否符合”yyyy-MM-dd HH:mm:ss”,在SpringBoot中当然可以用@Datetimeformat注解来进行验证,但字段的属性得用Date类型,由于我的项目中该字段用了String类型,需要对类型进行转换不太符合要求,所有用到了@Pattern注解。
在实体类的字段名上添加@Pattern注解,有个属性regexp,该属性的值就是正则表达式。
“yyyy-MM-dd HH:mm:ss”的正则表达式如下:
"^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"
我们还需用到@Validated注解,该注解使用在controller层的方法参数中,只有使用该注解,@pattern中的时间格式校验才起作用,这一点尤其重要。
2.实现案例
entity:
//删除时间
@Pattern(regexp = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$")
private String deletedAt;
controller:
/**
* 添加设备类别
*/
@ApiOperation(value = "添加设备类别",notes="传入参数是category对象")
@PostMapping("/category")
public int addCategory(@Validated Category category){
return iCategory.addCategory(category);
}
测试结果:
当输入的时间为2020-08-26或2020/08/26 11:22:33,时间格式不符合”yyyy-MM-dd HH:mm:ss”,就会出现报错,如下所示:
只有输入正确格式的数据,才能插入成功: