日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java Validation Api實(shí)現(xiàn)原理解析

瀏覽:81日期:2022-08-25 13:32:18

前言:

涉及知識(shí)點(diǎn):AOP、攔截器相關(guān)

功能主要實(shí)現(xiàn)類:因?yàn)閎ean validation只提供了接口并未實(shí)現(xiàn),使用時(shí)需要加上一個(gè)provider的包,例如hibernate-validator

范圍: 注解:@Valid @RequestBudy

主要實(shí)現(xiàn)類:RequestResponseBodyMethodProcessor

處理器:HandlerMethodArgumentResolver

注解說明:

@Valid:標(biāo)準(zhǔn)JSR-303規(guī)范的標(biāo)記型注解,用來標(biāo)記驗(yàn)證屬性和方法返回值,進(jìn)行級(jí)聯(lián)和遞歸校驗(yàn),@Valid可用于方法、字段、構(gòu)造器和參數(shù)上 @RequestBudy 請(qǐng)求的Body體,只能被讀取一次

RequestResponseBodyMethodProcessor 類說明:

// @since 3.1public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(RequestBody.class); } // 類上或者方法上標(biāo)注了@ResponseBody注解都行 @Override public boolean supportsReturnType(MethodParameter returnType) { return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) || returnType.hasMethodAnnotation(ResponseBody.class)); } // 這是處理入?yún)⒎庋b校驗(yàn)的入口,也是本文關(guān)注的焦點(diǎn) @Override public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception { // 它是支持`Optional`容器的 parameter = parameter.nestedIfOptional(); // 使用消息轉(zhuǎn)換器HttpInputMessage把request請(qǐng)求轉(zhuǎn)換出來,拿到值~~~ // 此處注意:比如本例入?yún)⑹荘erson類,所以經(jīng)過這里處理會(huì)生成一個(gè)空的Person對(duì)象出來(反射) Object arg = readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType()); // 獲取到入?yún)⒌拿Q,其實(shí)不叫形參名字,應(yīng)該叫objectName給校驗(yàn)時(shí)用的 // 請(qǐng)注意:這里的名稱是類名首字母小寫,并不是你方法里寫的名字。比如本利若形參名寫為personAAA,但是name的值還是person // 但是注意:`parameter.getParameterName()`的值可是personAAA String name = Conventions.getVariableNameForParameter(parameter); // 只有存在binderFactory才會(huì)去完成自動(dòng)的綁定、校驗(yàn)~ // 此處web環(huán)境為:ServletRequestDataBinderFactory if (binderFactory != null) { WebDataBinder binder = binderFactory.createBinder(webRequest, arg, name); // 顯然傳了參數(shù)才需要去綁定校驗(yàn)嘛 if (arg != null) {// 這里完成數(shù)據(jù)綁定+數(shù)據(jù)校驗(yàn)~~~~~(綁定的錯(cuò)誤和校驗(yàn)的錯(cuò)誤都會(huì)放進(jìn)Errors里)// Applicable:適合validateIfApplicable(binder, parameter);// 若有錯(cuò)誤消息hasErrors(),并且僅跟著的一個(gè)參數(shù)不是Errors類型,Spring MVC會(huì)主動(dòng)給你拋出MethodArgumentNotValidException異常// 否則,調(diào)用者自行處理if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) { throw new MethodArgumentNotValidException(parameter, binder.getBindingResult());} } // 把錯(cuò)誤消息放進(jìn)去 證明已經(jīng)校驗(yàn)出錯(cuò)誤了~~~ // 后續(xù)邏輯會(huì)判斷MODEL_KEY_PREFIX這個(gè)key的~~~~ if (mavContainer != null) {mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult()); } } return adaptArgumentIfNecessary(arg, parameter); } // 校驗(yàn),如果合適的話。使用WebDataBinder,失敗信息最終也都是放在它身上~ 本方法是本文關(guān)注的焦點(diǎn) // 入?yún)ⅲ篗ethodParameter parameter protected void validateIfApplicable(WebDataBinder binder, MethodParameter parameter) { // 拿到標(biāo)注在此參數(shù)上的所有注解們(比如此處有@Valid和@RequestBody兩個(gè)注解) Annotation[] annotations = parameter.getParameterAnnotations(); for (Annotation ann : annotations) { // 先看看有木有@Validated Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class); // 這個(gè)里的判斷是關(guān)鍵:可以看到標(biāo)注了@Validated注解 或者注解名是以Valid打頭的 都會(huì)有效哦 //注意:這里可沒說必須是@Valid注解。實(shí)際上你自定義注解,名稱只要一Valid開頭都成~~~~~ if (validatedAnn != null || ann.annotationType().getSimpleName().startsWith('Valid')) {// 拿到分組group后,調(diào)用binder的validate()進(jìn)行校驗(yàn)~~~~// 可以看到:拿到一個(gè)合適的注解后,立馬就break了~~~// 所以若你兩個(gè)主機(jī)都標(biāo)注@Validated和@Valid,效果是一樣滴~Object hints = (validatedAnn != null ? validatedAnn.value() : AnnotationUtils.getValue(ann));Object[] validationHints = (hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});binder.validate(validationHints);break; } } } ...}

可以看得,這個(gè)類應(yīng)該是陌生的,它能夠處理@ResponseBody注解返回值;它還有另一個(gè)能力是:它能夠處理請(qǐng)求參數(shù)(當(dāng)然也是標(biāo)注了@RequestBody的JavaBean)所以它既是個(gè)處理返回值的HandlerMethodReturnValueHandler,又是一個(gè)處理入?yún)⒌腍andlerMethodArgumentResolver。所以它命名為Processor而不是Resolver/Handler。

這是使用@RequestBody結(jié)合@Valid完成數(shù)據(jù)校驗(yàn)的基本原理。其實(shí)當(dāng)Spring MVC在處理@RequestPart注解入?yún)?shù)據(jù)時(shí),也會(huì)執(zhí)行綁定、校驗(yàn)的相關(guān)邏輯。對(duì)應(yīng)處理器是RequestPartMethodArgumentResolver,原理大體上和這相似,它主要處理Multipart相關(guān),本文忽略~

以上就是dui’y對(duì)于@Valid標(biāo)注的@RequestBody的JavaBean的原理說明,敬請(qǐng)指點(diǎn)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品亚洲产品| 少妇精品久久久一区二区| 日韩激情网站| 日韩和欧美一区二区三区| 视频一区欧美日韩| 免费在线观看日韩欧美| 久久国产福利| 香蕉久久一区| 国产日韩欧美一区二区三区 | 国产精品自在| 国产伦精品一区二区三区视频 | 日本久久精品| 日韩大片免费观看| 激情欧美一区| 亚洲在线网站| 97久久亚洲| 国产精品theporn| 精品美女在线视频| 日本蜜桃在线观看视频| 久久在线视频免费观看| 天堂网av成人| 黄色成人91| 亚洲精品美女| 国产精品一区亚洲| 日韩大片在线| 亚洲欧美日韩国产一区| 四虎精品永久免费| 欧美精品99| 欧美国产偷国产精品三区| 久久久久99| 午夜亚洲福利在线老司机| 蜜臀av一区二区三区| 欧美视频一区| av高清不卡| 亚洲一区欧美二区| 国产精品日韩精品在线播放| 吉吉日韩欧美| 亚洲在线成人| 国产精品日韩精品在线播放 | 91精品尤物| 国产一区二区视频在线看| 91精品一区二区三区综合| 美女91精品| 麻豆国产一区| 日韩中文在线电影| 老鸭窝毛片一区二区三区| 国产精品综合| av亚洲在线观看| 国产美女亚洲精品7777| 少妇精品导航| 国产一卡不卡| 在线视频观看日韩| 91精品啪在线观看国产爱臀| 超碰成人av| 中文字幕日韩欧美精品高清在线| 久久精品国产精品亚洲毛片| 九色精品91| 国产精品视频一区二区三区综合| 香蕉人人精品| 欧美亚洲综合视频| 另类中文字幕国产精品| 亚洲精品大全| 日韩中文字幕高清在线观看| 日韩1区2区3区| 91精品国产自产在线观看永久∴| 日本视频一区二区| 亚洲一级特黄| 精品亚洲精品| 亚洲日本久久| 久久高清精品| 久久免费福利| 亚洲一二av| 久久国产中文字幕| 精品国产aⅴ| 日韩精品五月天| 精品国产免费人成网站| 国产亚洲字幕| 亚洲精品少妇| 免费国产自久久久久三四区久久| 国产精品久久久一区二区| 久久电影一区| 国产综合激情| 福利一区二区免费视频| 热久久久久久| 日本欧美在线看| 亚洲不卡av不卡一区二区| 国产精品一区二区免费福利视频 | 日韩中出av| 99成人在线视频| 国精品产品一区| 欧美视频二区| 中文字幕一区二区三区四区久久 | 国产suv精品一区| 日韩一区二区三区精品视频第3页| 亚洲电影在线| 欧产日产国产精品视频| 久久久久黄色| 日韩精品一区二区三区av| 一本色道久久精品| 国内精品99| 999精品一区| 久草免费在线视频| 精品国产a一区二区三区v免费| 欧美天堂一区| 日韩亚洲精品在线观看| 免费看精品久久片| 一区在线免费| 国产一区亚洲| 久久精品青草| 久久久水蜜桃av免费网站| 日韩av在线播放网址| 久久99影视| 国产亚洲精品美女久久 | 日韩在线观看中文字幕| 蜜臀va亚洲va欧美va天堂| 亚洲一区二区三区免费在线观看 | 美女精品在线| 夜久久久久久| 首页亚洲欧美制服丝腿| 午夜久久免费观看| av亚洲在线观看| 91高清一区| 中文久久精品| 久久都是精品| 视频一区中文字幕精品| 日韩高清一级| 青青草国产成人99久久| 国产欧美日韩在线观看视频| 欧美一区免费| 国产精品亚洲四区在线观看| 麻豆精品久久| 国产精品不卡| 久久久久久久久久久9不雅视频| 激情综合在线| 在线一区免费观看| 中文字幕中文字幕精品| 日本一区二区中文字幕| 国产精品免费99久久久| 美女久久久久久 | 欧美在线首页| 美腿丝袜亚洲三区| bbw在线视频| 久久精品国产亚洲夜色av网站| 亚洲女同中文字幕| 免费人成在线不卡| 欧美午夜网站| 欧美好骚综合网| 91精品国产自产在线观看永久∴| 99亚洲视频| 日韩1区2区3区| 麻豆成人91精品二区三区| 欧美aa在线观看| 久久亚洲不卡| 国产日韩一区二区三区在线 | 在线观看精品| 亚洲一级影院| 亚洲va久久久噜噜噜久久| 国产色99精品9i| 成人福利视频| 亚洲视频播放| 欧美日本精品| 日韩中文字幕高清在线观看| 巨乳诱惑日韩免费av| 久久国产精品免费一区二区三区| 精品久久国产一区| 欧美成人高清| 日本午夜免费一区二区| 色偷偷偷在线视频播放| 亚洲综合三区| 美女性感视频久久| 久久久人人人| 日韩不卡手机在线v区| 日本一区二区免费高清| 久久国产精品99国产| 久久婷婷国产| 亚洲自拍另类| 精品久久中文| 亚洲激情黄色| 国产精品成人国产| 久久久国产精品一区二区中文| 中文字幕日韩亚洲| 麻豆mv在线观看| 亚洲欧美久久精品| 韩国三级一区| 国产亚洲久久| 影视先锋久久| 国产精品色在线网站| 91高清一区| 精品国产乱码| 亚洲开心激情| 日产精品一区| 国产精选一区| 亚洲国产一区二区在线观看| 国产精品一区二区美女视频免费看 | 在线日韩视频| 国产精品xxxav免费视频| 亚洲精品极品少妇16p| 美女精品视频在线| 日韩视频1区| 樱桃成人精品视频在线播放|