1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3897字,需瀏覽 8分鐘

         ·

        2021-06-17 11:06

        在SpringMvc開發(fā)過程中,我們通常會用一種注解的參數(shù)校驗法。因為用起來很方便。所以很受歡迎。今天就扒一扒這個注解異常校驗的流程。作者通過不斷的debug,終于找到北了。它在dispatchservlet中,總的調度入口如圖所示。

        最后在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) {//查看是否有何時的解析器 if (!this.resolvers.supportsParameter(parameter)) { throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));                    } try {//開始解析這個傳入的參數(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; } }


        在此類的開頭,我們看到這里可以設置很多解析器

        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; }
        我們看到這塊選出來的是ServletModelAttributeMethodProcessor,然后使用這個解析器進行參數(shù)校驗


        寫了一下午,沒保存.....

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

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

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

        @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)點懶,睡得的挺好,一天能睡很久。文章好久都沒更了,這是一個壞味道。希望早日回歸正常態(tài)。

        天氣很熱,注意開空調,節(jié)約用電~



        瀏覽 66
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美乱辈伦 | 99国产精品欧美久久久久的广告 | 琪琪色网| asian艳丽小少妇pics | 女人高潮特黄AAAAA片 | 97爱视频 | 中国美女操逼视频 | 爆操视频在线观看 | 人人摸妻人人操 | 日韩精品无码成人毛片视频 |