版权声明:杨杨杨~~的版权 https://blog.csdn.net/weixin_38316697/article/details/84959997
spring boot validation校验
大部分校验数据一般都是在前端校验,个人认为后台校验的多处场景应该在安全上,防止post进入。
spring boot validation校验主要有四步。
一、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
二、在实体类中添加验证注解(需要验证的字段)
列子:
/** 登录名称 */
@Excel(name = "登录名称")
private String loginName;
/** 用户名称 */
@Excel(name = "姓名")
@NotBlank(message = "姓名不能为空")
private String userName;
/** 用户邮箱 */
private String email;
/** 手机号码 */
@NotBlank(message = "手机号码不能为空")
@Excel(name = "手机号码")
private String phonenumber;
验证注解也可以用自定义注解。
这里附上部分标签含义
限制 | 说明 |
---|---|
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
@Past | 验证注解的元素值(日期类型)比当前时间早 |
@NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
@NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
三、在Controller层,在对应校验数据的接口参数部分添加@Valid注解
列子:
@PostMapping("/add")
@Transactional(rollbackFor = Exception.class)
@ResponseBody
public AjaxResult addSave(@Valid SysUser user) throws ParseException {
...
return toAjax(userService.insertUser(user));
}
四、统一异常处理(@ControllerAdvice必加,初始化使用)
列子:
@ControllerAdvice
public class BadRequestExceptionHandler extends ResponseEntityExceptionHandler {
private static final Logger log = LoggerFactory.getLogger(BadRequestExceptionHandler.class);
protected ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
Map<String, String> messages = new HashMap<String, String>();
BindingResult result = ex.getBindingResult();
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
for (ObjectError error : errors) {
FieldError fieldError = (FieldError) error;
messages.put(fieldError.getField(), fieldError.getDefaultMessage());
}
log.error(messages.toString());
}
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(messages);
}
}