小議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) {//查看是否有何時(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;}







寫了一下午,沒(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í)踐一下。
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)點(diǎn)懶,睡得的挺好,一天能睡很久。文章好久都沒(méi)更了,這是一個(gè)壞味道。希望早日回歸正常態(tài)。
天氣很熱,注意開(kāi)空調(diào),節(jié)約用電~
評(píng)論
圖片
表情
