前言
最近看到很多童鞋在项目中的对请求参数的校验都用的if来判断各参数的属性,如:
if(StringUtils.isBlank(username)){ return RR.exception("账号不能为空"); } if(StringUtils.isBlank(password)){ return RR.exception("密码不能为空"); } if(StringUtils.isBlank(realName)){ return RR.exception("姓名不能为空"); } ......
每个参数都需要这样一个个去校验null,返回对应信息,代码就像叠罗汉一样~~,在此,楼主强烈推荐一个神器:Validation,有了它,再也不用这样去校验参数啦,可以让我们在项目中不用太关注其他东西,专注于业务逻辑的编写。
引入核心依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
使用示例-添加用户
需要校验的实体类,在此使用了一些常用的校验注解,基本上能够见名知意,每个注解中都有message属性,就是校验不通过后的提示信息
@Data @AllArgsConstructor @NoArgsConstructor @ApiModel(value = "Account", description = "用户实体类") public class Account implements Serializable { private static final long serialVersionUID = -631033173072<mark style="color:transparent">本文来源gaodaimacom搞#^代%!码网@</mark>1778951L; private Long id; @NotBlank(message = "用户名不能为空") @Length(max = 10, message = "用户名最长为10位") private String name; @Pattern(regexp = PatternUtil.PASSWORDREGEX, message = "密码为6-20位数字加字母组合") private String pwd; @NotBlank(message = "姓名不能为空") @Length(max = 8, message = "姓名最长为8位") private String realName; @Pattern(regexp = PatternUtil.PHONENOREGEX, message = "手机号码格式不正确") private String phone; @NotNull(message = "用户性别不能为空") @Max(value = 1,message = "性别 0:男 1:女") @Min(value = 0,message = "性别 0:男 1:女") private Integer sex; @NotNull(message = "用户状态不能为空") @Max(value = 1,message = "用户状态 0:启用 1:禁用") @Min(value = 0,message = "用户状态 0:启用 1:禁用") private Integer status; @Length(max = 200, message = "备注最长为200个字符") private String rmk; }
controller接口,注意在接收参数前需加上@Validated注解,这样就会逐个去校验实体类中需要加了校验注解的的属性,完全通过才进入下一步业务处理,否则抛出MethodArgumentNotValidException异常,在这里我们直接将异常抛出,交给全局异常处理类来处理。
@SysLog(menu = "用户管理", function = "添加",filterParams = {"pwd","password","salt"}) @PermissionCheck("account:manager:add") @PostMapping(value = "/add", produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE) @ApiOperation(value = "用户管理-添加用户接口", notes = "用户管理-添加用户接口", httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class) public RR add(@Validated @RequestBody Account account) throws Exception { return RR.success("添加用户成功"); }
声明全局异常处理类,处理所有异常,可以随业务需要将异常种类细分,返回错误码,返回提示信息可自由定义… 这里只需关注MethodArgumentNotValidException异常。
@RestControllerAdvice public class GlobalExceptionHandle { /** * @param e * @return * @Description 未知异常处理 */ @ExceptionHandler(Exception.class) public RR handleException(Exception e) { e.printStackTrace(); return RR.exception("系统异常,请联系管理员"); } /** * @param e * @return * @Description 请求参数异常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public RR handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { return RR.exception("请求参数错误:[" + e.getBindingResult().getFieldError().getDefaultMessage() + "]"); } /** * @param e * @return * @Description 系统业务服务异常 */ @ExceptionHandler(ServerException.class) public RR handleServerException(ServerException e) { return RR.exception(e.getMessage()); } /** * @param e * @return * @Description 令牌校验异常 */ @ExceptionHandler(ExpireException.class) public RR handleExpireException(ExpireException e) { return RR.expire(e.getMessage()); } /** * @param e * @return * @Description 无权访问异常 */ @ExceptionHandler(AccessDeniedException.class) public RR handleAccessDeniedException(AccessDeniedException e) { return RR.forbidden(e.getMessage()); } /** * @param e * @return * @Description 自定义重复操作异常 */ public RR handleRepeatHandleException(RepeatHandleException e) { return RR.exception("您的请求已发送,请勿重复操作!"); } /** * @param e * @return * @Description 登录异常处理 */ @ExceptionHandler(AuthenticationException.class) public RR handleAuthenticationException(AuthenticationException e) { return RR.exception(e.getMessage()); } }