spring-注解校验属性

注解详解

哪些是String用,哪些是int用
https://blog.csdn.net/xnn_fjj/article/details/100603270

分组原文

https://blog.csdn.net/Y_hahaha/article/details/105975862?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165831691516782425176547%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165831691516782425176547&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-105975862-null-null.142v32control,185v2control&utm_term=BindException%E6%8C%89%E7%BB%84groups%E6%A0%A1%E9%AA%8C&spm=1018.2226.3001.4187

全局异常处理器

点击查看代码
@RestControllerAdvice
public class GlobalExceptionHandler {
  /**
     * spring验证异常
     */
    @ExceptionHandler(BindException.class)
    public AjaxResult validatedBindException(BindException e) {
        log.error(e.getMessage(), e);
        String message = e.getAllErrors().get(0).getDefaultMessage();
        return AjaxResult.error(message);
    }
 /**
     * jsr规范
     * 注解‘@Valid、@Validated’爆此异常
     * RequestParam校验参数异常.
     * @param e the e
     * @return R
     */
    @ExceptionHandler(ConstraintViolationException.class)
    @ResponseStatus(HttpStatus.OK)
    public AjaxResult constraintViolationException(ConstraintViolationException e) {
        log.error("请求参数异常 ex={}", e.getMessage(), e);
        return AjaxResult.error(e.getMessage());
    }
}


视图层使用

spring的注解

image

原生注解

image

BindingResult

使用场景,属性校验不想用全局处理器,本业务自己处理。
 参数使用此类,和对象必须挨在一起,

image

单独参数方式

image

对象方式

点击查看代码
@RequestMapping("update")
	@ResponseBody
	public Result saveOrUpdate(String id,HttpServletRequest request, @Validated(Jurisdiction.Add.class) Jurisdiction jur){

service通过方法调用

属性不分组

点击查看代码
private final org.springframework.validation.Validator validator;

 BindException be = new BindException(offline, "model");
                validator.validate(offline, be);
                if (be.hasErrors()) {
                    throw new ServerException(be.getAllErrors().get(0).getDefaultMessage());
                }

image

属性分组接口定义

  • 分组接口,注意点:父接口的包,分组接口不是静态
点击查看代码
public class Group {

    /**新增校验*/
    public interface Add{}
    /**删除校验*/
    public interface Remove{}
    /**修改校验*/
    public interface Edit{}
    /**导入校验*/
    public interface Import extends Default {}
}
  • validator,
    javax的用于非Controller,待确定:属性上有多个校验注解如,非空,正则,任一个注解分组后,所有校验注解都会生效,,解决办法:全部注解分好组。
    指定组类型和没分组的注解都会生效
点击查看代码
@Resource
private javax.validation.Validator validator;

校验代码

  • 获取属性中,该组的所有校验不合格信息,可以全部返回,也可遇到及中止,看具体业务。
点击查看代码
Set<ConstraintViolation<Jurisdiction>> validate = validator.validate(model, Jurisdiction.Import.class);
		for (ConstraintViolation<Jurisdiction> it : validate) {
			System.out.println(it.getMessage());
		}
		
// 抽象为泛型写法
  private<T> T getData(String responseJsonStr, Class<T>  t) {
        Object json = getDataJson(responseJsonStr);
        if (null == json) {
            return null;
        }
        return JsonUtils.jsonToPojo(json.toString(), t);
    }

实体类属性

引用类型嵌套

用户类下的部门类也需要校验属性。
@Valid注解(javax.validation.Valid)
如下所示,对dept加注解@Valid,对用户参数校验时,当部门属性不为空,会自动对部门属性做校验。
dept需要为必选项如何做?
** @NotEmpty亲测有效(注意是否有分组)!**

class User {
@NotBlank
private String name;

@Valid
private Dept dept;
}

点击查看代码
@NotBlank(groups = {Group.Import.class},message = "专业类型,不能为空;")
	private String biztypeCode;

钱的用法

点击查看代码
/**
Digits的integer整数比100000000多一位,这样的实际结果:参数小数位大于2时,才会触发Digits报错信息。
     * 支付金额(Digits校验小数位数,Decimal控制范围的最值,需一起使用)
     */
    @Schema(description = "支付金额(保留2位小数,范围:【0.00,100000000.00】)")
    @NotNull(message = "total_amount not null!",groups = {PayGroup.Offline.class})
    @DecimalMin(value = "0",groups = {PayGroup.Offline.class},message = "支付金额超出允许范围!")
    @DecimalMax(value = "100000000",groups = {PayGroup.Offline.class},message = "支付金额超出允许范围!")
    @Digits(integer = 10, fraction = 2,message = "支付金额,最多2位小数!",groups = {PayGroup.Offline.class})
    private BigDecimal totalAmount;

注解详解

  • 正则限制只能是某些字符
    @Pattern(regexp = "^(CP)|(QD)$",message = "objType值错误!")

只加@Size,不加@NotNull,改属性可以不传,但传了就会按Size的长度进行校验,可自测。
image

posted @ 2022-07-20 20:02  jf666new  阅读(152)  评论(0)    收藏  举报