原来的校验方式以及问题
在service层进行数据的判断,如果有许多的字段都做限制,导致写很多的if语句,代码臃肿,不美观。
if(StringUtils.isBlank(dto.getUsername())){
throw new RuntimeException("用户名不能为空");
}
统一校验实现
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、在DTO实体类进行参数校验
@NotEmpty表示属性不能为空
@Data
@ApiModel(value="UserDto", description="新增用户")
public class UserDto{
@NotEmpty(message = "用户名不能为空")
private String username;
}
3、在controller方法中添加@Validated注解
@ApiOperation("新增用户信息")
@PostMapping("/createUser")
public Resp r(@RequestBody @Validated UserDto userDto){
}
4、统一异常返回
如果校验出错Spring会抛出MethodArgumentNotValidException异常,我们需要在统一异常处理器中捕获异常,解析出异常信息。
/**
处理JSR抛出的异常
**/
@ResponseBody
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public RestErrorResponse doValidException(MethodArgumentNotValidException argumentNotValidException) {
BindingResult bindingResult = argumentNotValidException.getBindingResult();
StringBuffer errMsg = new StringBuffer();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
fieldErrors.forEach(error -> {
errMsg.append(error.getDefaultMessage()).append(",");
});
log.error(errMsg.toString());
return new RestErrorResponse(errMsg.toString());
}
分组校验
有的修改要求不能为空,而新增可以为空,使用分组的方式解决。
1、定义不同的分组
插入的组,修改的组,删除的组
public class ValidationGroups {
public interface Insert{
};
public interface Update{
};
public interface Delete{
};
}
2、实体类定义不同的分组校验
@NotEmpty(groups = {
ValidationGroups.Insert.class},message = "添加用户名不能为空")
@NotEmpty(groups = {
ValidationGroups.Update.class},message = "修改用户名不能为空")
private String name;
3、在Controller方法中启动校验规则指定要使用的分组名:
@ApiOperation("新增用户信息")
@PostMapping("/createUser")
public Resp r(@RequestBody @Validated({
ValidationGroups.Insert.class})UserDto userDto){
}
常用的校验注解
结束!!!!!!!
hy:4
凡事需多听但少言;聆听他人之意见,但保留自己之判断。---莎士比亚