Java之@Validated注解參數(shù)校驗(yàn)

@Validated可以幫助我們對(duì)接口的請(qǐng)求參數(shù)進(jìn)行判斷蕴茴,幫助我們對(duì)參數(shù)進(jìn)行約束劝评,可以用在類、方法和屬性上倦淀。
常用的參數(shù)注解示例:

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

// 帶注釋的元素只能為null
@Null(message = "用戶名有誤")
// 帶注釋的元素不能為null
@NotNull(message = "用戶名有誤")
// 帶注釋的元素不能為null 也不能為空 CharSequence類型計(jì)算字符序列的長(zhǎng)度 Collection類型評(píng)估集合大小 Map類型估計(jì)映射大小 Array類型評(píng)估數(shù)組長(zhǎng)度
@NotEmpty(message = "用戶名有誤")
// 帶注釋的元素不能為null 并且必須至少包含一個(gè)非空白字符
@NotBlank(message = "用戶名有誤")
String username;

// 帶注釋的元素必須為false蒋畜。支持的類型有 boolean 和 boolean null的元素被認(rèn)為是有效的
@AssertFalse(message = "該用戶為會(huì)員")
// 帶注釋的元素必須為true。支持的類型有 boolean 和 boolean null的元素被認(rèn)為是有效的
@AssertTrue(message = "該用戶非會(huì)員")
Boolean VIP;

// 帶注釋的元素必須是一個(gè)數(shù)字撞叽,其值必須小于或等于指定的最大值 支持的類型有:BigDecimal姻成、BigInteger、CharSequence愿棋、byte科展、short、int糠雨、long及其各自的包裝器 null的元素被認(rèn)為是有效的
@DecimalMax(value = "130", message = "年齡有誤")
// 帶注釋的元素必須是一個(gè)數(shù)字才睹,其值必須大于或等于指定的最小值 支持的類型有:BigDecimal、BigInteger、CharSequence琅攘、byte垮庐、short、int坞琴、long及其各自的包裝器 null的元素被認(rèn)為是有效的
@DecimalMin(value = "0", message = "年齡有誤")
/*
帶注釋的元素必須是可接受范圍內(nèi)的數(shù)字 支持的類型有:BigDecimal哨查、BigInteger、CharSequence置济、byte解恰、short、int和long浙于,并且它們各自的包裝類型 null的元素被認(rèn)為是有效的
integer 返回此數(shù)字可接受的最大整數(shù)位數(shù)
fraction 返回此數(shù)字可接受的最小整數(shù)位數(shù)
 */
@Digits(integer = 3, fraction = 1, message = "年齡有誤")
// 帶注釋的元素必須是一個(gè)數(shù)字护盈,其值必須小于或等于指定的最大值。支持的類型包括:BigDecimal羞酗、BigInteger腐宋、byte、short檀轨、int和long胸竞,并且它們各自的包裝類型
@Max(value = 130, message = "年齡有誤")
// 帶注釋的元素必須是一個(gè)數(shù)字,其值必須大于或等于指定的最小值参萄。支持的類型包括:BigDecimal卫枝、BigInteger、byte讹挎、short校赤、int和long,并且它們各自的包裝類型
@Min(value = 0, message = "年齡有誤")
// 帶注釋的元素必須是一個(gè)嚴(yán)格的負(fù)數(shù) 即0被視為無(wú)效值 支持的類型包括:BigDecimal筒溃、BigInteger马篮、byte、short怜奖、int浑测、long、float歪玲、double以及它們各自的包裝類型
@Negative
// 帶注釋的元素必須是一個(gè)嚴(yán)格意義上的正數(shù) 即0被視為無(wú)效值 支持的類型包括:BigDecimal迁央、BigInteger、byte滥崩、short岖圈、int、long夭委、float幅狮、double以及它們各自的包裝類型
@Positive
// 帶注釋的元素必須是負(fù)數(shù)或0 支持的類型包括:BigDecimal、BigInteger株灸、byte崇摄、short、int慌烧、long逐抑、float、double以及它們各自的包裝類型
@NegativeOrZero
// 帶注釋的元素必須是正數(shù)或0 支持的類型包括:BigDecimal屹蚊、BigInteger厕氨、byte、short汹粤、int命斧、long、float嘱兼、double以及它們各自的包裝類型
@PositiveOrZero
/*
帶注釋的元素大小必須介于指定的邊界(包括邊界)之間国葬。
min 返回大小元素必須大于或等于
max 返回大小元素必須小于或等于
 */
@Size(min = 0, max = 100)
Integer age;

// 字符串必須是格式正確的電子郵件地址。構(gòu)成有效電子郵件地址的確切語(yǔ)義留給雅加達(dá)Bean驗(yàn)證提供商芹壕。接受CharSequence類型 null的元素被認(rèn)為是有效的
@Email(message = "郵箱格式有誤")
String Email;

// 帶注釋的元素必須是將來(lái)的即時(shí)汇四、日期或時(shí)間 支持的類型包括:Date、Calendar踢涌、LocalDate通孽、LocalDateTime、LocalTime睁壁、MonthDay背苦、OffsetDateTime、OffsetTime堡僻、Year糠惫、YearMonth、ZonedDateTime
@Future(message = "預(yù)定時(shí)間有誤")
// 帶注釋的元素必須是過(guò)去的即時(shí)钉疫、日期或時(shí)間 支持的類型包括:Date硼讽、Calendar、LocalDate牲阁、LocalDateTime固阁、LocalTime、MonthDay城菊、OffsetDateTime备燃、OffsetTime、Year凌唬、YearMonth并齐、ZonedDateTime
@Past
Date scheduledTime;

// 帶注釋的元素必須與指定的正則表達(dá)式匹配。正則表達(dá)式遵循Java正則表達(dá)式約定請(qǐng) null元素被認(rèn)為是有效的
@Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$", message = "手機(jī)號(hào)碼有誤")
Integer mobilePhoneNumber;

上述示例一個(gè)元素上有多個(gè)注解僅為展示作用,實(shí)際編寫(xiě)代碼是一個(gè)足以况褪,但是像@Max@Min等有的注解可以組合使用

使用該注解需要做一個(gè)全局異常捕捉撕贞,不使用全局異常捕捉報(bào)錯(cuò):

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 [用戶名有誤]] ]

不太好看并且也不實(shí)用,所以需要添加異常捕捉并且記錄下問(wèn)題并打印日志

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參數(shù)校驗(yàn)失敗異常
   *
   * @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());
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末测垛,一起剝皮案震驚了整個(gè)濱河市捏膨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌食侮,老刑警劉巖号涯,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锯七,居然都是意外死亡链快,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)眉尸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)久又,“玉大人,你說(shuō)我怎么就攤上這事效五〉叵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵畏妖,是天一觀的道長(zhǎng)脉执。 經(jīng)常有香客問(wèn)我,道長(zhǎng)戒劫,這世上最難降的妖魔是什么半夷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮迅细,結(jié)果婚禮上巫橄,老公的妹妹穿的比我還像新娘。我一直安慰自己茵典,他們只是感情好湘换,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著统阿,像睡著了一般彩倚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扶平,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天帆离,我揣著相機(jī)與錄音,去河邊找鬼结澄。 笑死哥谷,一個(gè)胖子當(dāng)著我的面吹牛岸夯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播们妥,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼囱修,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了王悍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤餐曼,失蹤者是張志新(化名)和其女友劉穎压储,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體源譬,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡集惋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踩娘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刮刑。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖养渴,靈堂內(nèi)的尸體忽然破棺而出雷绢,到底是詐尸還是另有隱情,我是刑警寧澤理卑,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布翘紊,位于F島的核電站,受9級(jí)特大地震影響藐唠,放射性物質(zhì)發(fā)生泄漏帆疟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一宇立、第九天 我趴在偏房一處隱蔽的房頂上張望踪宠。 院中可真熱鬧,春花似錦妈嘹、人聲如沸柳琢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)染厅。三九已至,卻和暖如春津函,著一層夾襖步出監(jiān)牢的瞬間肖粮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工尔苦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涩馆,地道東北人行施。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像魂那,于是被迫代替她去往敵國(guó)和親蛾号。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容