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的注解

原生注解

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

单独参数方式

对象方式
点击查看代码
@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());
}

属性分组接口定义
- 分组接口,注意点:父接口的包,分组接口不是静态
点击查看代码
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的长度进行校验,可自测。


浙公网安备 33010602011771号