Spring-boot參數(shù)校驗:基本用法

問題

描述
接口的參數(shù)驗證(比如:字段長度搏色、字段需要符合某個格式)


解決思路

  1. 在控制器類的方法里自己寫校驗邏輯代碼
  2. 找找是否有可用的第三方庫

解決方案

1. 自己寫邏輯

  • 優(yōu)點
  1. 足夠自由,可以完全按照業(yè)務(wù)邏輯寫
  2. 不需要額外引入第三方庫
  • 缺點
  1. 不夠優(yōu)雅
  2. 參數(shù)驗證與業(yè)務(wù)邏輯本身關(guān)系不大崔拥,會占用大量精力
  3. 后期的維護(hù)成本高

2. 使用Bean Validation

1. PathVariable校驗

直接將參數(shù)驗證的條件加到參數(shù)后面,{group:\d{6}}表示參數(shù)group必須是6位的數(shù)據(jù)
示例

@RequestMapping(value = "pathVariableTest/{group:\\d{6}}/{userid}")
   public String pathVariableTest(@PathVariable("group") String group, @PathVariable("userid") Integer userid) {
       return "suc";
   }

訪問一個錯誤路徑似将,會得到404響應(yīng)
結(jié)果

{
    "timestamp": "2020-10-19T09:29:12.950+00:00",
    "status": 404,
    "error": "Not Found",
    "message": "",
    "path": "/pathVariableTest/aAa/3"
}

注意:PathVariable 只有正則表達(dá)式可達(dá)到校驗的目的,即只有正則表達(dá)式這一種驗證方式

2. RequestParam校驗

  • 在對應(yīng)的參數(shù)上添加校驗條件
 @RequestMapping(value = "requestParamTest")
    public String requestParamTest(
            @RequestParam @Size(min = 1, max = 10, message = "姓名長度必須為1到10") String name,
            @Min(value = 10, message = "年齡最小為10") @Max(value = 100, message = "年齡最大為100") @RequestParam("age") Integer age) {
        return "suc";
    }
  • 聲明MethodValidationPostProcessor

注意:這一步是為了要啟用RequestParam校驗

@Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
  • Controller指定@Validated注解

注意:一定要在Ctroller類上尝抖,不然校驗條件也是無法生效的懊昨。

 @RequestMapping(value = "requestParamTest")
    public String requestParamTest(
            @RequestParam @Size(min = 1, max = 10, message = "姓名長度必須為1到10") String name,
            @Min(value = 10, message = "年齡最小為10") @Max(value = 100, message = "年齡最大為100") @RequestParam("age") Integer age) {
        return "suc";
    }

嘗試使用非法值訪問
結(jié)果

{
    "timestamp": "2020-10-19T10:07:44.509+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "message": "",
    "path": "/requestParamTest"
}
2020-10-19 17:42:13.424 ERROR 21660 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.validation.ConstraintViolationException: requestParamTest.age: 年齡最大為100] with root cause

javax.validation.ConstraintViolationException: requestParamTest.age: 年齡最大為100
    at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:116) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691) ~[spring-aop-5.2.9.RELEASE.jar:5.2.9.RELEASE]
    at com.hyq.demo.springbootdemo.ParamValidController$$EnhancerBySpringCGLIB$$293abf03.requestParamTest(<generated>) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_161]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_161]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_161]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_161]
    ...

3.RequestBody驗證

對于直接JSON消息體傳參窄潭,同樣可以定義校驗規(guī)則

  • 在接口上設(shè)置參數(shù)校驗

注意:必須要將將注解Validated設(shè)置在參數(shù)上,在Ctroller類上的設(shè)置對RequestBody的校驗無效

@RequestMapping(value = "requestBodyTest")
    public String requestBodyTest(@Validated @RequestBody User user) {
        return "suc";
    }
  • 在RequestBody對應(yīng)的Bean上設(shè)置校驗條件
public class User {
    @Size(min = 1, max = 10, message = "姓名長度必須為1到10")
    private String name;

    @Min(value = 10, message = "年齡最小為10")
    @Max(value = 100, message = "年齡最大為100")
    private int age;
}

嘗試使用非法值訪問
結(jié)果

{
    "timestamp": "2020-10-19T10:00:29.682+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "",
    "path": "/requestBodyTest"
}
2020-10-19 18:00:29.673  WARN 22448 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.String com.hyq.demo.springbootdemo.ParamValidController.requestBodyTest(com.hyq.demo.springbootdemo.User): [Field error in object 'user' on field 'age': rejected value [192]; codes [Max.user.age,Max.age,Max.int,Max]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.age,age]; arguments []; default message [age],100]; default message [年齡最大為100]] ]

4.表單對象校驗

參考鏈接


參考文章

springboot 參數(shù)校驗詳解
SpringBoot里參數(shù)校驗/參數(shù)驗證

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酵颁,一起剝皮案震驚了整個濱河市嫉你,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躏惋,老刑警劉巖幽污,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異簿姨,居然都是意外死亡距误,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門扁位,熙熙樓的掌柜王于貴愁眉苦臉地迎上來准潭,“玉大人,你說我怎么就攤上這事域仇⊙勾ⅲ” “怎么了皆疹?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵惠奸,是天一觀的道長俗壹。 經(jīng)常有香客問我,道長般卑,這世上最難降的妖魔是什么武鲁? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮蝠检,結(jié)果婚禮上沐鼠,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好饲梭,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布乘盖。 她就那樣靜靜地躺著,像睡著了一般憔涉。 火紅的嫁衣襯著肌膚如雪订框。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天兜叨,我揣著相機(jī)與錄音穿扳,去河邊找鬼。 笑死国旷,一個胖子當(dāng)著我的面吹牛矛物,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跪但,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼履羞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屡久?” 一聲冷哼從身側(cè)響起忆首,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涂身,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搓蚪,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡蛤售,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妒潭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悴能。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雳灾,靈堂內(nèi)的尸體忽然破棺而出漠酿,到底是詐尸還是另有隱情,我是刑警寧澤谎亩,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布炒嘲,位于F島的核電站,受9級特大地震影響匈庭,放射性物質(zhì)發(fā)生泄漏夫凸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一阱持、第九天 我趴在偏房一處隱蔽的房頂上張望夭拌。 院中可真熱鬧,春花似錦、人聲如沸鸽扁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桶现。三九已至躲雅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間巩那,已是汗流浹背吏夯。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留即横,地道東北人噪生。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像东囚,于是被迫代替她去往敵國和親跺嗽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361