ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> 通常,服务端的数据校验通常不是面向用户的,提示信息还是应该以面向程序员和运维人员为主,在数据进入后台之前进行一道拦截。前端js的数据校验提示信息,是面向用户的,要更加的友好! ## 一、异常校验的规范及常用注解 在web开发时,对于请求参数,一般上都需要进行参数合法性校验的,原先的写法时一个个字段一个个去判断,这种方式太不通用了,所以java的JSR 303: Bean Validation规范就是解决这个问题的。 JSR 303只是个规范,并没有具体的实现,目前通常都是才有hibernate-validator进行统一参数校验。 JSR303定义的校验类型(可以参考《3.3 YAML配置属性值校验》) | Constraint | 详细信息 | | --- | --- | | @Null | 被注释的元素必须为 null | | @NotNull | 被注释的元素必须不为 null | | @AssertTrue | 被注释的元素必须为 true | | @AssertFalse | 被注释的元素必须为 false | | @Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 | | @Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 | | @DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 | | @DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 | | @Size(max, min) | 被注释的元素的大小必须在指定的范围内 | | @Digits (integer, fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 | | @Past | 被注释的元素必须是一个过去的日期 | | @Future | 被注释的元素必须是一个将来的日期 | | @Pattern(value) | 被注释的元素必须符合指定的正则表达式 | Hibernate Validator 附加的 constraint | Constraint | 详细信息 | | --- | --- | | @Email | 被注释的元素必须是电子邮箱地址 | | @Length | 被注释的字符串的大小必须在指定的范围内 | | @NotEmpty | 被注释的字符串的必须非空 | | @Range | 被注释的元素必须在合适的范围内 | **用法:把以上注解加在ArticleVO的属性字段上,然后在参数校验的方法上加@Valid注解** >这里git版本问题没有引入,需要重新引入一下jar包。详细见《3.3 YAML配置属性值校验》 如: ![](https://img.kancloud.cn/9c/c5/9cc52502718ce6356836de1fd47f2529_834x434.png) ~~~ @PutMapping("/articles/{id}") public @ResponseBody AjaxResponse updateArticle(@PathVariable Long id, @Valid @RequestBody ArticleVO article) { article.setId(id); articleRestService.updateArticle(article); return AjaxResponse.success(article); } ~~~ ![](https://img.kancloud.cn/36/9f/369fd828190e0c25dde6da70667db23f_1176x264.png) postman测试一下 正常update没问题 ![](https://img.kancloud.cn/f7/61/f761a9dbb0b57a058f604dff401569f6_1412x847.png) 将content改成空之后发现抛出异常 ![](https://img.kancloud.cn/bf/b7/bfb743c830fd55a5f3d056b57f37cf43_1434x817.png) ## 二、友好的数据校验异常处理(用户输入异常的全局处理) 我们已知当数据校验失败的时候,会抛出异常BindException或MethodArgumentNotValidException。所以我们对这两种异常做全局处理,防止程序员重复编码带来困扰。 在异常注解写message: ![](https://img.kancloud.cn/10/d7/10d7d894cd1c35ae14074c026e950bf2_914x229.png) 在WebExceptionHandler写两个异常的处理: ![](https://img.kancloud.cn/ba/c6/bac618e0e6b91dbe9b36fff3214df73a_1249x587.png) ~~~ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public AjaxResponse handleBindException(MethodArgumentNotValidException ex) { FieldError fieldError = ex.getBindingResult().getFieldError(); return AjaxResponse.error(new CustomException(CustomExceptionType.USER_INPUT_ERROR,fieldError.getDefaultMessage())); } @ExceptionHandler(BindException.class) @ResponseBody public AjaxResponse handleBindException(BindException ex) { FieldError fieldError = ex.getBindingResult().getFieldError(); return AjaxResponse.error(new CustomException(CustomExceptionType.USER_INPUT_ERROR,fieldError.getDefaultMessage())); } ~~~ 在启动服务测试一下,发现异常显示为处理内容 ![](https://img.kancloud.cn/6f/63/6f63f5e4586504781c7a854d96f8024e_1407x876.png) >总结一下: 在实际开发中,写业务实现时开发只需要在model层写异常校验和对应的message,同时在Controller层对应的方法内加@Valid注解。 其他的异常处理在全局异常处理中实现并返回给前端,开发人员只需要关注校验注解和校验方法就可以了。 ![](https://img.kancloud.cn/7c/a5/7ca58640759c0c286660d04e559681f4_560x808.png)