spring-boot-starter-validation 数据校验
依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
查看LocalValidatorFactoryBean类的源码,发现默认的ValidationMessageSource(校验出错时的提示文件)是resources目录下的ValidationMessages.properties文件,因此在resources目录下创建ValidationMessages.properties文件
user.name.size=用户名长度介于5到10个字符之间
user.address.NotEmpty=用户地址不能为空NotEmpty
user.age.size=年龄输入不正确
user.email.notnull=邮箱不能为空notnull
user.email.pattern=邮箱格式不正确
创建User类,配置数据校验:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @Data public class User2 { private Integer id; @AssertFalse (groups = ValidationGroup2. class ) private Boolean enabled; @PastOrPresent (groups = ValidationGroup2. class ) private Year birthday; @Size (min = 5 , max = 10 , message = "{user.name.size}" , groups = ValidationGroup1. class ) private String name; @NotEmpty (message = "{user.address.NotEmpty}" , groups = ValidationGroup2. class ) private String address; @Min (value = 1 , message = "{user.age.size}" , groups = ValidationGroup2. class ) @DecimalMax (value = "200" , message = "{user.age.size}" ) @Digits (integer = 3 ,fraction = 3 ,groups = ValidationGroup2. class ) @NegativeOrZero (groups = ValidationGroup2. class ) private Integer age; @Email (message = "{user.email.pattern}" ) @NotNull (message = "{user.email.notnull}" , groups = {ValidationGroup1. class , ValidationGroup2. class }) private String email; } |
配置完成后,接下来创建UserController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | @RestController @RequestMapping ( "/valid" ) public class UserValidatedController { /** * 给User参数添加@Validated注解,表示需要对该参数做校验,紧接着的BindingResult参数表示在校验出错时保存的出错信息 * * @param user user * @param result 在校验出错时保存的出错信息 * @return 出错信息 */ @PostMapping ( "/user" ) // public List<String> addUser(@Validated @RequestBody User2 user, BindingResult result) { public List<String> addUser( @Validated (ValidationGroup2. class ) @RequestBody User2 user, BindingResult result) { List<String> errors = new ArrayList<>(); // 如果BindingResult中的hasErrors方法返回true,表示有错误信息,此时遍历错误信息,将之返回给前端。 if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); for (ObjectError error : allErrors) { errors.add(error.getDefaultMessage()); } } return errors; } @PostMapping ( "/user2" ) public void user2( @Validated (ValidationGroup2. class ) @RequestBody User2 user) { } } |
分组校验:
1 2 3 4 5 | public interface ValidationGroup1 { } public interface ValidationGroup2 { } |
校验注解:
全域异常捕获:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | @ControllerAdvice @Slf4j public class GlobalExceptionHandler { //post请求参数校验抛出的异常 @ExceptionHandler (value = MethodArgumentNotValidException. class ) @ResponseBody public Response methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) { /*//获取异常中随机一个异常信息 FieldError fieldError = e.getBindingResult().getFieldError(); return Response.buildFailure(fieldError.getCode(), fieldError.getDefaultMessage());*/ return getResponse(e.getBindingResult(), e); } //get请求参数校验抛出的异常 @ExceptionHandler (BindException. class ) @ResponseBody public Response bindExceptionHandler(BindException e) { /*//获取异常中随机一个异常信息 FieldError fieldError = e.getBindingResult().getFieldError(); return Response.buildFailure(fieldError.getCode(), fieldError.getDefaultMessage());*/ return getResponse(e.getBindingResult(), e); } private Response getResponse(BindingResult bindingResult, Exception e) { List<String> errors = new ArrayList<>(); if (bindingResult.hasErrors()) { List<ObjectError> allErrors = bindingResult.getAllErrors(); for (ObjectError error : allErrors) { errors.add(error.getDefaultMessage()); } } List<String> stringList = errors.stream().sorted().collect(Collectors.toList()); // 排序 return Response.buildFailure( "" , stringList.toString()); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2019-07-06 Spring MVC 国际化
2019-07-06 Spring MVC 为控制器添加通知与处理异常