Java之@Validated注解参数校验

@Validated可以帮助我们对接口的请求参数进行判断,帮助我们对参数进行约束,可以用在类、方法和属性上。
常用的参数注解示例:

import javax.validation.constraints.*;
import java.util.Date;

// 带注释的元素只能为null
@Null(message = "用户名有误")
// 带注释的元素不能为null
@NotNull(message = "用户名有误")
// 带注释的元素不能为null 也不能为空 CharSequence类型计算字符序列的长度 Collection类型评估集合大小 Map类型估计映射大小 Array类型评估数组长度
@NotEmpty(message = "用户名有误")
// 带注释的元素不能为null 并且必须至少包含一个非空白字符
@NotBlank(message = "用户名有误")
String username;

// 带注释的元素必须为false。支持的类型有 boolean 和 boolean null的元素被认为是有效的
@AssertFalse(message = "该用户为会员")
// 带注释的元素必须为true。支持的类型有 boolean 和 boolean null的元素被认为是有效的
@AssertTrue(message = "该用户非会员")
Boolean VIP;

// 带注释的元素必须是一个数字,其值必须小于或等于指定的最大值 支持的类型有:BigDecimal、BigInteger、CharSequence、byte、short、int、long及其各自的包装器 null的元素被认为是有效的
@DecimalMax(value = "130", message = "年龄有误")
// 带注释的元素必须是一个数字,其值必须大于或等于指定的最小值 支持的类型有:BigDecimal、BigInteger、CharSequence、byte、short、int、long及其各自的包装器 null的元素被认为是有效的
@DecimalMin(value = "0", message = "年龄有误")
/*
带注释的元素必须是可接受范围内的数字 支持的类型有:BigDecimal、BigInteger、CharSequence、byte、short、int和long,并且它们各自的包装类型 null的元素被认为是有效的
integer 返回此数字可接受的最大整数位数
fraction 返回此数字可接受的最小整数位数
 */
@Digits(integer = 3, fraction = 1, message = "年龄有误")
// 带注释的元素必须是一个数字,其值必须小于或等于指定的最大值。支持的类型包括:BigDecimal、BigInteger、byte、short、int和long,并且它们各自的包装类型
@Max(value = 130, message = "年龄有误")
// 带注释的元素必须是一个数字,其值必须大于或等于指定的最小值。支持的类型包括:BigDecimal、BigInteger、byte、short、int和long,并且它们各自的包装类型
@Min(value = 0, message = "年龄有误")
// 带注释的元素必须是一个严格的负数 即0被视为无效值 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
@Negative
// 带注释的元素必须是一个严格意义上的正数 即0被视为无效值 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
@Positive
// 带注释的元素必须是负数或0 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
@NegativeOrZero
// 带注释的元素必须是正数或0 支持的类型包括:BigDecimal、BigInteger、byte、short、int、long、float、double以及它们各自的包装类型
@PositiveOrZero
/*
带注释的元素大小必须介于指定的边界(包括边界)之间。
min 返回大小元素必须大于或等于
max 返回大小元素必须小于或等于
 */
@Size(min = 0, max = 100)
Integer age;

// 字符串必须是格式正确的电子邮件地址。构成有效电子邮件地址的确切语义留给雅加达Bean验证提供商。接受CharSequence类型 null的元素被认为是有效的
@Email(message = "邮箱格式有误")
String Email;

// 带注释的元素必须是将来的即时、日期或时间 支持的类型包括:Date、Calendar、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime
@Future(message = "预定时间有误")
// 带注释的元素必须是过去的即时、日期或时间 支持的类型包括:Date、Calendar、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime
@Past
Date scheduledTime;

// 带注释的元素必须与指定的正则表达式匹配。正则表达式遵循Java正则表达式约定请 null元素被认为是有效的
@Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$", message = "手机号码有误")
Integer mobilePhoneNumber;

上述示例一个元素上有多个注解仅为展示作用,实际编写代码是一个足以,但是像@Max@Min等有的注解可以组合使用

使用该注解需要做一个全局异常捕捉,不使用全局异常捕捉报错:

2023-06-06 16:24:00.000  WARN 9796 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.String com.iyunfish.shoujifeng.advice.UserVO: [Field error in object 'UserVO' on field 'username': rejected value [null]; codes [NotBlank.UserVO.username,NotBlank.username,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [UserVO.username,username]; arguments []; default message [username]]; default message [用户名有误]] ]

不太好看并且也不实用,所以需要添加异常捕捉并且记录下问题并打印日志

import com.iyunfish.shoujifeng.response.Response;
import org.springframework.http.HttpStatus;
import org.springframework.validation.*;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/********************************************************************************
 ** date:2023/06/06
 ** description&desc:全局休息控制器建议
 *********************************************************************************/
@ControllerAdvice
public class GlobalRestControllerAdvice {
  /**
   * 处理@Validated参数校验失败异常
   *
   * @param exception 异常类
   * @return {@link Response }<{@link String }>
   */
  @ExceptionHandler(MethodArgumentNotValidException.class)
  @ResponseBody
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  public Response<String> exceptionHandler(MethodArgumentNotValidException exception) {
    BindingResult result = exception.getBindingResult();
    StringBuilder stringBuilder = new StringBuilder();
    if (result.hasErrors()) {
      List<ObjectError> errors = result.getAllErrors();
      errors.forEach(p -> {
        FieldError fieldError = (FieldError) p;
        stringBuilder.append(fieldError.getDefaultMessage());
      });
    }
    return Response.fail(stringBuilder.toString());
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容