我在Spring MVC 3.0中遇到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)

我用来在该 Controller 中初始化ModelAttribute的代码是:
    @ModelAttribute("id")
    public long getUserId(HttpSession session) {
        UserInfoHolder userHolder = (UserInfoHolder) session
                .getAttribute("userHolder");
        long userId = userHolder.getUserId();
        return userId;
    }

据我所知,该错误无法在本地工作站上复制。它发生在调用 Action 之前。

在HandlerMethodInvoker.java中(第762行),我们看到以下行:
bindObject = BeanUtils.instantiateClass(paramType);

我的一个有经验的同行认为这行会引起问题,因为原始类型的ModelAttribute(long)没有构造函数。我认为这个原因可能是正确的,但是如何解释Web应用程序在本地服务器上运行正常呢?

我试图搜索以了解ModelAttribute是否支持原始数据类型,但效果不佳。有没有人对此问题有经验?

最佳答案

我只是想些什么,希望对您有所帮助。

堆栈跟踪表明它确实在试图长时间调用构造函数方法:

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

如果您将使用的类型从long更改为Long,是否有效?

至于在本地工作但不在客户端上工作的事情。 Java版本是否相同?

关于java - ModelAttribute可以是原始的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6675987/

10-10 01:57