Jsr303

1.0 @NotBlank,@Valid

@NotNull://CharSequence, Collection, Map 和 Array 对象不能是 null, 但可以是空集(size = 0)。
@NotEmpty://CharSequence, Collection, Map 和 Array 对象不能是 null 并且相关对象的 size 大于 0。
@NotBlank://String 不是 null 且去除两端空白字符后的长度(trimmed length)大于 0。

<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
            <scope>compile</scope>
        </dependency>
<dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>7.0.0.Alpha5</version>
 </dependency>
  
    @NotBlank(message = "品牌名必须提交")
    private String name;
    
    @Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母")
    private String firstLetter;

   @NotNull
    @Min(value = 0,message = "排序必须大于等于0")
    private Integer sort;
    
    @NotEmpty
    @URL(message = "logo必须是一个合法的url地址")
    private String logo;

   @RequestMapping("/save")
    //   @RequiresPermissions("product:brand:save")
    public R save(@Valid @RequestBody BrandEntity brand, BindingResult result) {
        if (result.hasErrors()) {
            Map<String, String> map = new HashMap<>();
            //1. 获取校验的错误结果
            result.getFieldErrors().forEach((item) -> {
                //FieldError 获取错误提示
                String message = item.getDefaultMessage();
                // 获取错误的属性的名字
                String field = item.getField();
                map.put(field,message);

            });
            return R.error(400, "提交的数据不合法").put("data",map);

        }
        brandService.save(brand);
        return R.ok();
    }

2.0 统一异常处理

 @Slf4j
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {

 @ExceptionHandler(value = MethodArgumentNotValidException.class)
 public R handleVaildException(MethodArgumentNotValidException e){
     log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
     BindingResult bindingResult = e.getBindingResult();
     HashMap<String, String> errorMap = new HashMap<>();
     bindingResult.getFieldErrors().forEach((fieldError) -> {
         errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
     });
     return R.error(400,"数据校验出现问题").put("data",errorMap);
 }
 @ExceptionHandler(value = Throwable.class)
 public R handleException(Throwable throwable){
     return R.error();
 }
 
}

=============用枚举类=====
package com.atguigu.common.exception;

public enum BizCodeEnume {

 UNKNOW_EXCEPTION(10000,"系统未知异常"),

 VAILD_EXCEPTION(10001,"参数格式校验失败");

 private int code;
 private String msg;

 BizCodeEnume(int code,String msg){
     this.code =code;
     this.msg=msg;
 }

 public int getCode() {
     return code;
 }

 public String getMsg() {
     return msg;
 }
}

    return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);
 }
 @ExceptionHandler(value = Throwable.class)
 public R handleException(Throwable throwable){
     return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
 }

3.0 分组校验

在这里插入图片描述

  /**
     * 保存
     */
    @RequestMapping("/save")
    //   @RequiresPermissions("product:brand:save")
    public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand/*, BindingResult result*/) {

        brandService.save(brand);
        return R.ok();
    }

4.0 自定义校验

1)、编写一个自定义的校验注解
2)、编写一个自定义的校验器
3)、关联自定义的校验器和自定义的校脸注解

 /**
     * 显示状态[0-不显示;1-显示]
     */
    @ListValue(vals={0,1},groups = {AddGroup.class})
    private Integer showStatus;

========================
package com.atguigu.common.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(
        validatedBy = {ListValueConstraintValidator.class,/* 可以指定多个不同校验器,适配不同类型的校验*/}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    String message() default "{com.atguigu.common.valid.ListValue.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    int[] vals() default {};
}

===============================
package com.atguigu.common.valid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {

    private Set<Integer> 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 integer, ConstraintValidatorContext constraintValidatorContext) {

        return set.contains(integer);
    }
}

在这里插入图片描述

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页