@Null @NotNull
可以在注解的括号中定义自己的message提示
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Null(message = "新增不能指定ID",groups = {AddGroup.class})
@NotNull(message = "修改必须指定id",groups = {UpdateGroup.class})
@TableId
private Long brandId;
@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})
private String name;
@NotEmpty(message = "logo不能为空",groups = {AddGroup.class})
@URL(message = "logo必须是一个合法的url",groups = {AddGroup.class,UpdateGroup.class})
private String logo;
private String descript;
@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
@ListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class})
private Integer showStatus;
@NotEmpty(groups = {AddGroup.class})
@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母",groups = {AddGroup.class,UpdateGroup.class})
private String firstLetter;
@NotNull(groups = {AddGroup.class})
@Min(value = 0,message = "排序必须大于等于0",groups = {AddGroup.class,UpdateGroup.class})
private Integer sort;
}
2.分组校验
(1)controller接口
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){
(2)实体类
@NotBlank(message = "品牌名不能为空",groups = {AddGroup.class,UpdateGroup.class})
(3)默认没有指定分组的校验注解@NotBlank,在分组校验情况下不生效,只会在@Validated生效
3.开启校验注解功能@Validated({AddGroup.class}) 可以指定校验的组
@Valid
@RequestMapping("/save")
public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){
brandService.save(brand);
return R.ok();
}
4.给校验的bean后面紧跟BindingResult
就可以获取到校验的结果
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
5.统一的异常处理
@RestControllerAdvice 此注解是统一处理异常的注解
是由ResponseBody ControllerAdvice组合而成的
接下来对异常的信息进行整理组合成返回值
@Slf4j
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleValidException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
HashMap errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError) -> {
errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
});
return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(),BizCodeEnum.VALID_EXCEPTION.getMsg()).put("data",errorMap);
}
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){
log.error("错误:",throwable);
return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(),BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
}
}
二、自定义注解
1.先声明一个自定义注解 接口
@Documented
@Constraint(validatedBy = { ListValueContraintValidator.class }) //指定一下使用哪个校验器
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{com.atguigu.valid.ListValue.message}";
Class>[] groups() default { };
Class extends Payload>[] payload() default { };
int[] vals() default {
};
}
2.编写自定义注解的校验器
//校验器 public class ListValueContraintValidator implements ConstraintValidator3.将自定义注解和自定义注解联系起来 4.自定义注解的message提示信息(写在resource目录下) 5.自定义注解的使用{ private Set set = new HashSet<>(); //初始化方法 @Override public void initialize(ListValue constraintAnnotation) { int[] vals = constraintAnnotation.vals(); for (int val : vals) { set.add(val); } } //判断是否校验成功 @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { return set.contains(value); } }



