<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          小議SpringMvc參數(shù)綁定流程

          共 3897字,需瀏覽 8分鐘

           ·

          2021-06-17 11:06

          在SpringMvc開(kāi)發(fā)過(guò)程中,我們通常會(huì)用一種注解的參數(shù)校驗(yàn)法。因?yàn)橛闷饋?lái)很方便。所以很受歡迎。今天就扒一扒這個(gè)注解異常校驗(yàn)的流程。作者通過(guò)不斷的debug,終于找到北了。它在dispatchservlet中,總的調(diào)度入口如圖所示。

          最后在InvocableHandlerMethod類中獲取傳入的參數(shù)。

              protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {        MethodParameter[] parameters = this.getMethodParameters();        if (ObjectUtils.isEmpty(parameters)) {            return EMPTY_ARGS;        } else {            Object[] args = new Object[parameters.length];

          for(int i = 0; i < parameters.length; ++i) { MethodParameter parameter = parameters[i]; parameter.initParameterNameDiscovery(this.parameterNameDiscoverer); args[i] = findProvidedArgument(parameter, providedArgs); if (args[i] == null) {//查看是否有何時(shí)的解析器 if (!this.resolvers.supportsParameter(parameter)) { throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));                    } try {//開(kāi)始解析這個(gè)傳入的參數(shù) args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory); } catch (Exception var10) { if (logger.isDebugEnabled()) { String exMsg = var10.getMessage(); if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) { logger.debug(formatArgumentError(parameter, exMsg)); } }

          throw var10; } } }

          return args; } }


          在此類的開(kāi)頭,我們看到這里可以設(shè)置很多解析器

          public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgumentResolver {    private final ListargumentResolvers =new ArrayList();    private final Map, HandlerMethodArgumentResolver> argumentResolverCache = new ConcurrentHashMap(256);
          public HandlerMethodArgumentResolverComposite() { }//添加解析器 public HandlerMethodArgumentResolverComposite addResolver(HandlerMethodArgumentResolver resolver) { this.argumentResolvers.add(resolver); return this; }//添加解析器 public HandlerMethodArgumentResolverComposite addResolvers(@Nullable HandlerMethodArgumentResolver... resolvers) { if (resolvers != null) { Collections.addAll(this.argumentResolvers, resolvers); }
          return this; }
          我們看到這塊選出來(lái)的是ServletModelAttributeMethodProcessor,然后使用這個(gè)解析器進(jìn)行參數(shù)校驗(yàn)


          寫了一下午,沒(méi)保存.....

          上邊寫的這些其實(shí)還是沒(méi)有分析到精髓上,我們大概的了解了一下流程,但是對(duì)于像@NotNull等注解的具體解析都沒(méi)有找到,當(dāng)然也不知道如何自定義一個(gè)注解解析器,并添加到viltaler中。所以上邊的分析并不是很好,迷迷糊糊的。但是作者在DispatchServlet中發(fā)現(xiàn)了一個(gè)異常處理器。其是可以定義多個(gè)的,而且會(huì)輪詢?nèi)?zhí)行,知道出現(xiàn)一個(gè)可以處理該異常的解析器就停止。

                  作者查看源碼,發(fā)現(xiàn)在DispatchServlet初始化的時(shí)候,從Spring上下文中獲取了這些解析器,代碼如下圖所示。

                  這塊的意思就是說(shuō)咋通過(guò)實(shí)現(xiàn)接口HandlerExceptionResolver,然后將其注入到SpringIoc中即可讓SpringMvc去執(zhí)行我們自定義的異常處理機(jī)制。也就是全局異常處理,但勢(shì)必需要讓我們自定義的異常處理器執(zhí)行的比較早。所以我們實(shí)踐一下。

          @Componentpublic class MyHand implements HandlerExceptionResolver, Ordered {    @Override    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {        System.out.println("12");        e.printStackTrace();        System.out.println(o.toString());        return null;    }
          @Override public int getOrder() { return 0; }}

                  我們看一下效果:

                  最近優(yōu)點(diǎn)懶,睡得的挺好,一天能睡很久。文章好久都沒(méi)更了,這是一個(gè)壞味道。希望早日回歸正常態(tài)。

          天氣很熱,注意開(kāi)空調(diào),節(jié)約用電~



          瀏覽 66
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲中文字幕免费视频 | 操逼吃瓜网| 欧美手机在线视频 | 亚洲第一色播 | 91人妻日韩人妻无码专区精品 |