2011-07-13 79 views
5

我在Spring MVC 3.0中遇到了ModelAttribute的一個奇怪問題。當我在本地部署應用程序時,它工作正常。但是,當我部署一個遠程服務器上的應用程序,它失敗每次用戶訪問一個特定的動作,與錯誤:Can ModelAttribute可以是原始的嗎?

ERROR: my.package.application.web.filter.ExceptionFilter - long.<init>() 
java.lang.NoSuchMethodException: long.<init>() 
     at java.lang.Class.getConstructor0(Class.java:2706) 
     at java.lang.Class.getDeclaredConstructor(Class.java:1985) 
     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:104) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:762) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:356) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:153) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

的代碼,我的用戶給init的ModelAttribute在控制器:

@ModelAttribute("id") 
    public long getUserId(HttpSession session) { 
     UserInfoHolder userHolder = (UserInfoHolder) session 
       .getAttribute("userHolder"); 
     long userId = userHolder.getUserId(); 
     return userId; 
    } 

據我所知,該錯誤不能在我的本地工作站上重現。它發生在動作被調用之前。

展望HandlerMethodInvoker.java(線762),我們看到這一行:

bindObject = BeanUtils.instantiateClass(paramType); 

一個經驗豐富的礦山的同行認爲,這條線會導致問題,因爲原始型的ModelAttribute(長)沒有按」沒有一個構造函數。我認爲這個理由也許是對的,但是它怎麼解釋web應用在我的本地服務器上工作正常?

我試圖搜索以知道ModelAttribute是否支持原始數據類型,但沒有很好的結果。有沒有人有關於這個問題的經驗?

回答

5

我只是拋出一些想法,希望它可能有所幫助。

堆棧跟蹤表明,它確實試圖調用類的構造方法長:

java.lang.NoSuchMethodException: long.<init>() 

它的工作原理,如果你從長期改變使用類型爲長?

至於在本地工作,但不在客戶端上的東西。 Java版本是一樣的嗎?

+0

我已經試過了,但它仍然失敗,對於Long類型也有相同的錯誤。 Java版本是相同的:Java 1.6 –

+0

當你這樣做的時候,你是否在HandlerMethodInvoker.java(762行)設置了一個斷點並檢查了paramType是什麼?它也變成了Long嗎? – Raku

+0

是的,它變成了長。 –

相關問題