5

Spring MVC 3.0 の ModelAttribute で奇妙な問題が発生しています。アプリを localhost にデプロイすると、正常に動作します。しかし、アプリをリモート サーバーにデプロイすると、ユーザーが特定のアクションにアクセスするたびに次のエラーで失敗します。

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(long) にはコンストラクターがないため、この行が問題を引き起こすと考えています。その理由はおそらく正しいと思いますが、ローカル サーバーで Web アプリケーションが正常に動作することをどのように説明できますか?

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

4

1 に答える 1

5

少しでも参考になればと思い、色々と考えてみました。

スタック トレースは、コンストラクター メソッドを長時間呼び出そうとしていることを示しています。

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

使用する型を long から Long に変更すると動作しますか?

ローカルでは機能するがクライアントでは機能しないものについて。Javaのバージョンは同じですか?

于 2011-07-13T08:27:21.960 に答える