前端自定义校验

目录

前端elment-ui 校验器

 正则表达式校验

JSR303数据校验

 统一异常处理

JSR303分组校验

 自定义校验

编写自定义注解

定义校验器类

自定义messasge

 应用


前端elment-ui 校验器

form表单加上 :rules="**"

前端自定义校验_第1张图片

 字段加上 prop="*"

前端自定义校验_第2张图片

 编写valdate前端自定义校验_第3张图片

 正则表达式校验

        firstLetter: [
          {
            validator: (rule, value, callback) => {
              if (value === "") {
                callback(new Error("首字母必须填写"));
              } else if (!/^[a-zA-Z]$/.test(value)) {
                callback(new Error("首字母必须返回A-Z之间"));
              }
            },
            trigger: "blur",
          },
        ],
        sort: [
          {
            validator: (rule, value, callback) => {
              if (value == "") {
                callback(new Error("排序必须填写"));
              } else if (!/^[0-9]*$/.test(value)) {
                callback(new Error("排序必须是一个大于0的整数"));
              }
            },
            trigger: "blur",
          },
        ]

JSR303数据校验

导入依赖springboot2.2.3版本不在集成validate需要自己导入依赖

          
            
                org.springframework.boot
                spring-boot-starter-validation
                2.2.1.RELEASE
            

 试题中添加@NotEmpty

前端自定义校验_第4张图片

请求参数前加上@Valid

前端自定义校验_第5张图片

测试

正则表达式:/^[a-zA-Z]$/

以^a开始到Z$结束

实体类

@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * 品牌id
	 */
	@TableId
	private Long brandId;
	/**
	 * 品牌名
	 */
	@NotEmpty(message = "name字段不可为空")
	private String name;
	/**
	 * 品牌logo地址
	 */
	@NotEmpty
	@URL(message = "logo必须是一个合法的url地址")
	private String logo;
	/**
	 * 介绍
	 */
	private String descript;
	/**
	 * 显示状态[0-不显示;1-显示]
	 */
	private Integer showStatus;
	/**
	 * 检索首字母
	 */
	@NotEmpty
	@Pattern(regexp = "/^[a-zA-Z]$/",message = "检索首字母必须是一个字母")
	private String firstLetter;
	/**
	 * 排序
	 */
	@NotNull
	@Min(value = 0,message = "排序必须大于等于0")
	private Integer sort;

}
    @RequestMapping("/save")
   // @RequiresPermissions("product:brand:save")
    public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
        if(result.hasErrors()){
            Map map = new HashMap<>();
            //获取校验的错误信息
            result.getFieldErrors().forEach((item)->{
                String defaultMessage = item.getDefaultMessage();
                String filed = item.getField();
                map.put(filed,defaultMessage);
            });

            return R.error(400,"连接数据不合法").put("data",map);
        }else{
            brandService.save(brand);
        }
        return R.ok();
    }

前端自定义校验_第6张图片

 统一异常处理

使用SpringMVC的@controllerAdvce

定义一个异常类

/**
package com.atguigu.gulimall.product.exception;

import com.atguigu.common.exception.BizCodeEnume;
import com.atguigu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/**
 * 集中所有异常
 */
@Slf4j
//@ResponseBody
//@ControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class ExceptionControllerAdvice {

    /**
     * 告诉spring处理什么异常
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public R handleVaildException(MethodArgumentNotValidException e){
        log.error("数据校验出现问题{},异常类型{}",e.getMessage(),e.getClass());

        BindingResult bindingResult = e.getBindingResult();

        Map errorMap = new HashMap<>();
        //遍历异常数据
        bindingResult.getFieldErrors().forEach((item)->{
            String field = item.getField();
            String message = item.getDefaultMessage();
            errorMap.put(field,message);
        });
        //返回异常结果集
        return R.error(BizCodeEnume.INVAILD_EXCEPTION.getCode(),BizCodeEnume.INVAILD_EXCEPTION.getMsg()).put("data",errorMap);

    }
    /**
     * 如果有异常精确匹配到handleVaildException方法异常,启动handleVaildException方法异常
     * 不可以匹配到,则走handleException方法异常
     * 全局匹配异常
     */
    @ExceptionHandler(value = Throwable.class)
    public R handleException(Throwable throwable){



        return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
    }
}

JSR303分组校验

	/**
	 * 品牌id
	 */
	@NotNull(message = "修改必须制定品牌id",groups = {UpdateGroup.class})
	@Null(message = "新增不能指定id",groups = {AddGroup.class})
	@TableId
	private Long brandId;
	/**
	 * 品牌名
	 */
	@NotEmpty(message = "name字段不可为空",groups = {UpdateGroup.class,AddGroup.class})
	private String name;
	/**
	 * 品牌logo地址

指定分组,进行校验,没有指定分组的字段不走校验

前端自定义校验_第7张图片

 自定义校验

   编写自定义注解

@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 {
    //com.atguigu.common.valid.ListValue.mes
    String message() default "{com.atguigu.common.valid.ListValue.mes}";

    Class[] groups() default {};

    Class[] payload() default {};
    
    int[] vals() default {};
}

@Constraint( validatedBy = {ListValueConstraintValidator.class})

定义校验器类

public class ListValueConstraintValidator implements ConstraintValidator {
    private Set set = new HashSet<>();

    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();
        for (int val:vals  ) {
            set.add(val);
        }
    }

    //判断是否校验成功

    /**
     *
     * @param value 需要校验的值
     * @param constraintValidatorContext
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        //判断是否包含值
        return set.contains(value);
    }
}

自定义messasge

前端自定义校验_第8张图片

 应用

必须包含1或2否则错误

	@ListValue(vals = {0,1},groups = {UpdateGroup.class,AddGroup.class})
	private Integer showStatus;

你可能感兴趣的:(学习,vue.js,javascript,html5)