前言
在默认情况下springboot会引入Hibernate Validator机制来支持JSR-303验证规范,另外一个方面我们偶尔也会自定义验证规则。
1、加上验证
这个操作比较简单,只需要在目标对象上加入注解即可,如下所示:
package com.learn.springauthserver.dto;
import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import java.io.Serializable;
/**
* autor:liman
* createtime:2019/12/15
* comment:
*/
@Data
public class UpdatePsdDto implements Serializable {
@NotBlank(message="旧密码不能为空")
private String oldPassword;
@NotBlank(message="新密码不能为空")
private String newPassword;
}
这里用到了lombok插件,左右直接省略了各种getter和setter方法,通过@NotBlank注解加入了针对这个字段的校验,
2、标示需要验证
在controller中,标示该对象为需要验证的对象,需要加入@Validated注解。
@RequestMapping(value = "/token/password/update", method = RequestMethod.POST)
public BaseResponse updatePassword(@RequestHeader String accessToken, @RequestBody @Validated UpdatePsdDto updatePsdDto
, BindingResult bindingResult) {
log.info("客户开始修改密码,需要失效之前的token");
BaseResponse baseResponse = new BaseResponse(StatusCode.Success);
try {
if (StringUtils.isBlank(accessToken)) {
return new BaseResponse(StatusCode.AccessTokenNotBlank);
}
//参数校验,加了@Validated注解的参数,校验的结果都会放到bindingResult中。
String res = ValidatorUtils.checkResult(bindingResult);
if (StringUtils.isNotBlank(res)) {
return new BaseResponse(StatusCode.InvalidParams.getCode(), res);
}
//开始修改密码
dbAuthService.updatePassword(accessToken,updatePsdDto);
} catch (Exception e) {
baseResponse = new BaseResponse(StatusCode.Fail, e.getMessage());
}
return baseResponse;
}
在UpdatePsdDto对象前加入了@Validted注解,标示这个参数会被校验,同时会增加BindingResult类型的参数,这个参数会自动存储校验的结果。我们后续获取该参数的验证信息,只需要处理这个参数即可。
3、获取验证信息
/**
* autor:liman
* createtime:2019/12/15
* comment:统一参数校验工具
*/
public class ValidatorUtils {
public static String checkResult(BindingResult result){
StringBuilder stringBuilder = new StringBuilder("");
if(result != null && result.hasErrors()){
List<ObjectError> errors = result.getAllErrors();
errors.forEach(error->stringBuilder.append(error.getDefaultMessage()).append("\n"));
}
return stringBuilder.toString();
}
}
这个校验工具做的事情无非就是从BindingResult中获取校验结果。如果校验结果不为空,则表示校验未通过。可以进行相应的异常处理。
总结
偏使用,没啥可总结的。