spring boot参数校验和自定义注解实现参数校验
spring boot参数校验和自定义注解实现参数校验
环境配置
- 首先,添加相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@Valid的使用
-
实体类添加相关注解
@Data @ApiModel(value = "UserReq对象") public class UserSaveReq implements Serializable { @NotBlank(message = "姓名不能为空") private String name; @NotNull(message = "年龄不能为空") private Integer age; @NotBlank(message = "性别不能为空") private String sex; }
-
在传参的实体类前添加@Valid注解
@ApiOperation("测试spring boot校验参数")
@PostMapping("/save")
public ApiResult<List<SysUser>> saveUser(@Valid @RequestBody UserSaveReq userSaveReq) {
log.info("测试spring boot校验参数");
sysUserService.saveUser(userSaveReq);
return ApiResult.success();
}
-
在统一异常拦截处理器里, 添加该异常处理方式
@ExceptionHandler(value = {MethodArgumentNotValidException.class}) public ApiResult<Void> serviceException(MethodArgumentNotValidException ex) { log.error("service exception:{}", ex.getMessage()); Map<String, String> errorMap = new HashMap<>(); ex.getBindingResult().getAllErrors().forEach(error -> { String fieldName = ((FieldError) error).getField(); String errorMessage = error.getDefaultMessage(); errorMap.put(fieldName, errorMessage); }); return ApiResult.result(SystemErrorType.ARGUMENT_NOT_VALID.getCode(), errorMap.toString(), null); }
- 测试如下
自定义校验注解
实体类新增region 地区 , 校验此字段的值只能为 北京 , 上海, 广州
- 新增一个注解
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = RegionValidator.class)
public @interface CheckRegion {
String message() default "Invalid param, please check your code bitch";
Class[] groups() default {};
Class[] payload() default {};
}
-
新增该注解处理类 , 继承ConstraintValidator
public class RegionValidator implements ConstraintValidator<CheckRegion,String>{ @Override public boolean isValid(String value, ConstraintValidatorContext context) { Set<Object> regionSet = new HashSet<>(); regionSet.add("北京"); regionSet.add("上海"); regionSet.add("广州"); return regionSet.contains(value); } }
-
使用 对应字段上添加上CheckRegion注解
@Data @ApiModel(value = "UserSaveReq") public class UserSaveReq implements Serializable { @NotBlank(message = "姓名不能为空") private String name; @NotNull(message = "年龄不能为空") private Integer age; @NotBlank(message = "性别不能为空") private String sex; @NotBlank(message = "地址不能为空") @CheckRegion(message = "地址不在所选范围内") private String region; }
-
测试