ModelAttribute可以是原始类型吗?

5

我在使用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)

我在该控制器中使用的代码来初始化ModelAttribute是:

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

据我所知,这个bug在我的本地工作站上无法重现。并且它发生在调用动作之前。
查看HandlerMethodInvoker.java(第762行),我们可以看到以下代码:
bindObject = BeanUtils.instantiateClass(paramType);

我认识一位经验丰富的同行,他认为这行代码会导致问题,因为原始类型ModelAttribute(long)没有构造函数。我认为这个理由可能是正确的,但是它如何解释我的本地服务器上网页应用程序运行良好呢?

我尝试搜索以了解ModelAttribute是否支持原始数据类型,但没有找到好的结果。有人遇到过这个问题吗?

1个回答

5

我只是提供一些想法,希望能有所帮助。

堆栈跟踪显示它确实尝试调用long的构造方法:

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

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

至于本地工作但客户端不工作的问题。Java版本是否相同?


我已经尝试过了,但仍然无法解决Long类型的相同错误。Java版本是相同的:Java 1.6 - Hoàng Long
当你完成这个步骤后,你是否在HandlerMethodInvoker.java(第762行)设置了断点,并检查了paramType的值?它是否也被改为了Long类型? - Raku
1
哦,Long也没有零参数构造函数 - 这是BeanUtils调用的内容。这看起来更像是Spring中的一个错误,他们未能正确处理基本数据类型的实例化。我现在唯一能看到的解决方法是使用包装类代替 :-/. - Raku
最后我必须接受现实并制定一个解决方案。太糟糕了,因为我甚至还没有找到导致错误的原因。 - Hoàng Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接