由一個異常開始思考springmvc參數解析


首先記錄一下異常,以及異常出現的原因和解決方案

  異常主要信息:

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屬性啊!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM