2011-07-13 16 views
5

Spring MVC 3.0のModelAttributeに奇妙な問題があります。 localhostでアプリケーションをデプロイすると、正常に動作します。しかし、私は、リモートサーバー上でアプリケーションを展開するとき、それはエラーと毎回ユーザーのアクセス特定のアクションを、失敗します。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) 

私はそのコントローラに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(長い)」はdoesnのため、この行は、問題を引き起こすことを信じていますコンストラクタを持っています。その理由は正しいかもしれませんが、Webアプリケーションがローカルサーバー上で正常に動作することをどのように説明できますか?

ModelAttributeがプリミティブデータ型をサポートしているかどうかを調べようとしましたが、良い結果は得られませんでした。誰もがこの問題について経験を持っていますか?

答えて

5

ちょっと役立つと思って、ちょっとした思考を投げかけています。あなたが長いからロングに使用されるタイプを変更した場合

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

それは動作します:

スタックトレースは、確かに長いためにコンストラクタメソッドを呼び出ししようとしていることを示していますか?

ローカルでは動作しますが、クライアントでは動作しません。 Javaのバージョンは同じですか?

+0

私はすでに試してみましたが、それでもLong型の場合と同じエラーで失敗します。 Javaのバージョンは同じです:Java 1.6 –

+0

これを済ませたら、HandlerMethodInvoker.javaにブレークポイントを設定して(762行目)、paramTypeが何であるかチェックしてください。ロングにも変わったの? – Raku

+0

はい、ロングに変更されました。 –

関連する問題