首先記錄一下異常,以及異常出現的原因和解決方案 異常主要信息: 我說一下我的解決過程 我根據這個異常的提示,跟蹤到AbstractNamedValueMethodArgumentResolver的resolveArgument方法,然後從介面中看到了它的作用,就是將 處理器中的映射方法的參數進行處理 ...
首先記錄一下異常,以及異常出現的原因和解決方案
異常主要信息:
2016-10-12 12:40:46,808 ERROR [500.jsp] - Name for argument type [java.lang.String] not available, and parameter name information not found in class file either. java.lang.IllegalArgumentException: Name for argument type [java.lang.String] not available, and parameter name information not found in class file either. at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.updateNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:141) at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.getNamedValueInfo(AbstractNamedValueMethodArgumentResolver.java:119) at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:86) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) at org.springframework.web.method.annotation.ModelFactory.invokeModelAttributeMethods(ModelFactory.java:136)
我說一下我的解決過程 我根據這個異常的提示,跟蹤到AbstractNamedValueMethodArgumentResolver的resolveArgument方法,然後從介面中看到了它的作用,就是將
處理器中的映射方法的參數進行處理
從這張繼承圖也可以看出來,對於參數中的任何註解都會調用處理器,包括:@RequetParam,@PathVaiable,@Value,@RequestHeader@Value @CookieValue @MatrixVariable 至於每個註解的使用 都可以執行百度。
搜嘎!我大概知道了 應該是我的項目中這些註解中出的問題 然後在debug看
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(MethodParameter, ModelAndViewContainer, NativeWebRequest, WebDataBinderFactory)
這個方法中的各個參數 猜得沒錯的話 第一的就是代表處理器的方法了,繼續往下看,有這樣一段代碼:
private NamedValueInfo updateNamedValueInfo(MethodParameter parameter, NamedValueInfo info) { String name = info.name; if (info.name.length() == 0) { name = parameter.getParameterName(); if (name == null) { throw new IllegalArgumentException("Name for argument type [" + parameter.getParameterType().getName() + "] not available, and parameter name information not found in class file either."); } } String defaultValue = (ValueConstants.DEFAULT_NONE.equals(info.defaultValue) ? null : info.defaultValue); return new NamedValueInfo(name, info.required, defaultValue); }
沒錯 異常就是這個來的 我發現name竟然是null ,聯想到我的RequestParam註解的name屬性沒有的,是不是這個原因呢?但是不對啊 雖然沒有name屬性 但是不是會迷人的根據後面的欄位來生成的嗎?以前教程都是這樣說的。我把這個疑問Google了一下 網上一致說的是ant設置了debug級別,需要改成on 但是我根本沒有用ant。我是使用eclipse的tomcat。最後的猜想是eclipse有這樣的一個設置 最後果然沒錯還真有:
。重啟就ok了!!!
問題是解決了,但是很不解啊 因為如果是這樣的話 那麼不確定性很高啊 萬一別人沒有設置怎麼辦呢?
google了一波 其實這是因為大家都被大部分的springmvc視頻或者教程誤導了,官方的解釋是只有在debug模式編譯時,參數名才會保留在class文件中,spring由此可以反射綁定......
所以說 最後是一定要加name屬性啊!!!