后端参数校验:@NotNull、@NotEmpty、@NotBlank、@Size、@Min、@Max、@Pattern、@Email、@Future、@Past
·
前端向后端发起请求,肯定会携带参数,后端接收到了之后,后端对参数进行合法性判断
一、spring-boot-starter-validation简介:
spring-boot-starter-validation 是 Spring Boot 提供的一个启动器模块,它主要用于简化在 Spring Boot 应用程序中的验证功能。开发者可以在模型类字段上使用注解来定义验证规则。
使用
二、常用注解说明
- @NotNull:值不能为null;
- @NotEmpty:字符串、集合或数组的值不能为空,即长度大于0;
- @NotBlank:字符串的值不能为空白,即不能只包含空格;
- @Size:字符串、集合或数组的大小是否在指定范围内;
- @Min:数值的最小值;
- @Max:数值的最大值;
- @Pattern:字符串是否匹配指定的正则表达式;
- @Email:字符串是否为有效的电子邮件地址;
- @Future:日期是否为将来的日期;
- @Past:日期是否为过去的日期;
三、引入依赖
引入在moudules下的pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@Validated:⽤于标记,某个类将触发验证
@GetMapping("/validation")
public String validation(@Validated ValidationDTO validationDTO) {
return "参数测试";
}
参数类修改
package com.qyy.system.test.domain;
import jakarta.validation.constraints.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDate;
@Getter
@Setter
public class ValidationDTO {
@NotNull(message = "昵称不能为null")
private String nickName;
@NotEmpty(message = "用户账号不能为空")
private String userAccount;
@NotBlank(message = "用户密码不能为空,并且不能只包含空格")
@Size(min = 5, max = 10, message = "密码长度不能少于5位,不能大于10位")
private String password;
@Min(value = 0, message = "年龄不能小于0岁")
@Max(value = 60, message = "年龄不能大于60岁")
private int age;
@Email(message = "必须符合邮箱格式")
private String email;
@Pattern(regexp = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$", message = "手机号码格式不正确")
private String phone;
@Past(message = "开始日期必须是过去的日期")
private LocalDate startDate;
@Future(message = "结束日期必须是未来的日期")
private LocalDate endDate;
}
如何更加准确合理的把错误信息返还给用户
在全局异常处理中,捕获异常
在GlobalExceptionHandler类中添加如下代码
//拦截参数校验异常
@ExceptionHandler(BindException.class)
public R<Void> handleBindException(BindException e) {
log.error(e.getMessage());
String message = join(e.getAllErrors(),
DefaultMessageSourceResolvable::getDefaultMessage, ", ");
return R.fail(ResultCode.FAILED_PARAMS_VALIDATE.getCode(), message);
}
//拦截验证异常
private <E> String join(Collection<E> collection, Function<E, String>
function, CharSequence delimiter) {
if (CollUtil.isEmpty(collection)) {
return StrUtil.EMPTY;
}
return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter));
}

更多推荐


所有评论(0)