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

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

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

瀏覽:79日期: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)。

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

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆国产精品视频| 国产剧情在线观看一区| 欧美亚洲自偷自偷| 69堂免费精品视频在线播放| 午夜宅男久久久| 蜜臀久久久久久久| 老司机精品久久| 免费人成在线不卡| 日韩中文字幕在线一区| 日本 国产 欧美色综合| 日韩视频精品在线观看| 尹人成人综合网| 亚洲一区二区免费在线观看| 日韩精品一二三| 国产视频网站一区二区三区| 麻豆久久一区二区| 亚洲性图久久| 亚洲免费毛片| 久久精品亚洲一区二区| 精精国产xxxx视频在线播放| 欧美+亚洲+精品+三区| 视频一区二区欧美| 国产欧美二区| 欧美freesex黑人又粗又大| 影音先锋国产精品| 国产亚洲第一伦理第一区| 国产一区丝袜| 石原莉奈在线亚洲二区| 欧美激情日韩| 男人操女人的视频在线观看欧美| 久久av中文| 亚洲一区区二区| 久久精品系列| 亚州精品视频| 久久国产主播| 亚洲欧洲日韩精品在线| 成人精品视频| 深夜日韩欧美| 久久久久久久久99精品大| 88久久精品| 伊人久久婷婷| 成年男女免费视频网站不卡| 蜜桃视频在线观看一区| 新版的欧美在线视频| 国产日产高清欧美一区二区三区 | 亚洲欧美日本国产| 极品日韩av| 9999国产精品| 欧美激情在线精品一区二区三区| 99视频一区| 日本久久成人网| 精品在线网站观看| 日韩超碰人人爽人人做人人添| 青青久久av| 国产精品白丝一区二区三区| 免费视频最近日韩| 日韩午夜电影| 日韩视频中文| 夜夜嗨一区二区| 精品在线99| 欧美日韩在线播放视频| 亚洲最新无码中文字幕久久| 日本麻豆一区二区三区视频| 亚洲一区日韩| 日韩在线播放一区二区| 黄色在线一区| 在线一区免费观看| 国产精品婷婷| 免费在线视频一区| 樱桃成人精品视频在线播放| 国产99亚洲| 亚洲在线国产日韩欧美| 性欧美精品高清| 丝袜美腿亚洲色图| 婷婷精品在线观看| 欧美另类中文字幕| 国产极品久久久久久久久波多结野| 18国产精品| 免费视频一区二区三区在线观看| 国产美女精品视频免费播放软件| 国产极品模特精品一二| 国产aⅴ精品一区二区三区久久| 福利欧美精品在线| 99久精品视频在线观看视频| 日韩毛片视频| 9色精品在线| 91精品国产自产在线丝袜啪| 国产欧美一区二区三区精品观看| 老牛国内精品亚洲成av人片| 亚洲黄色网址| 香蕉久久久久久久av网站| 日韩精品免费视频人成| 久久精品亚洲| 国产精品视频一区二区三区综合 | 国产伊人久久| 欧美一区=区| 91综合网人人| 久久精品97| 欧美日韩国产高清电影| 91综合久久爱com| 久久精品卡一| 精品视频99| 欧美一区自拍| 免费日韩视频| 99精品电影| 日韩精品电影| 国产精品久久| 亚洲精品精选| 噜噜噜躁狠狠躁狠狠精品视频| 国产乱子精品一区二区在线观看| 极品裸体白嫩激情啪啪国产精品| 国产极品一区| 久久精品72免费观看| 首页欧美精品中文字幕| 欧美天堂视频| 久草免费在线视频| 精品网站999| 久久中文字幕导航| 奇米亚洲欧美| 日韩欧美激情电影| 综合激情婷婷| 日韩精品一二区| 亚洲香蕉视频| 免费不卡在线观看| 欧美a级片一区| 欧美日韩水蜜桃| 日韩视频一区| 免费成人av在线播放| 伊人久久亚洲| 日韩高清国产一区在线| 日韩一区二区三免费高清在线观看| 国产亚洲毛片在线| 亚洲免费一区二区| 久色成人在线| 深夜日韩欧美| 日韩高清不卡在线| 国产精品巨作av| 欧美黑人巨大videos精品| 欧美精品福利| 国产精品美女午夜爽爽| 国产精品欧美日韩一区| 麻豆精品在线视频| 日韩精品免费一区二区在线观看 | 亚洲一区日韩| 婷婷成人基地| av不卡在线看| 免费的成人av| 欧美亚洲三区| 国产中文字幕一区二区三区| 国产亚洲观看| 国产精品麻豆久久| 国产伊人精品| 亚洲日产国产精品| 日本一区免费网站| 久久精品国产亚洲一区二区三区| 国产一区二区三区不卡视频网站 | 国产精品腿扒开做爽爽爽挤奶网站| 国产亚洲精品久久久久婷婷瑜伽| 亚洲视频二区| 国产精品玖玖玖在线资源| 久久一区亚洲| 欧美日韩高清| 日韩在线观看中文字幕| 亚洲aa在线| 久久精品欧洲| 性欧美长视频| 精品欧美视频| 免费在线看一区| 高清不卡一区| 亚洲影院天堂中文av色| 欧美国产中文高清| 99视频精品免费观看| 免费日韩一区二区三区| 欧美精品九九| 精品国产成人| 亚洲另类视频| 久久国产电影| 国产极品久久久久久久久波多结野| 中文字幕色婷婷在线视频| 蜜桃免费网站一区二区三区| 久久精品国产久精国产爱| 中文字幕一区二区精品区| 欧洲亚洲一区二区三区| 国产欧美自拍一区| 蜜桃一区二区三区在线| 三级精品视频| 精品久久91| 国产精品a级| 久久激情综合网| 亚洲有吗中文字幕| 亚洲一区激情| 五月精品视频| 激情综合网站| 成人在线视频区| 欧美国产日本| 美女高潮久久久| 国产精品2区| 美女久久精品| 久久av网址| 精品国产亚洲日本|