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




最后在InvocableHandlerMethod類中獲取傳入的參數(shù)。
protected Object[] getMethodArgumentValues(NativeWebRequest request, 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;}







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

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

這塊的意思就是說咋通過實現(xiàn)接口HandlerExceptionResolver,然后將其注入到SpringIoc中即可讓SpringMvc去執(zhí)行我們自定義的異常處理機制。也就是全局異常處理,但勢必需要讓我們自定義的異常處理器執(zhí)行的比較早。所以我們實踐一下。
public class MyHand implements HandlerExceptionResolver, Ordered {public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {System.out.println("12");e.printStackTrace();System.out.println(o.toString());return null;}public int getOrder() {return 0;}}
我們看一下效果:

最近優(yōu)點懶,睡得的挺好,一天能睡很久。文章好久都沒更了,這是一個壞味道。希望早日回歸正常態(tài)。
天氣很熱,注意開空調,節(jié)約用電~
評論
圖片
表情
