Может ли ModelAttribute быть примитивным? - PullRequest
5 голосов
/ 13 июля 2011

У меня странная проблема с ModelAttribute в Spring MVC 3.0. Когда я развертываю приложение на локальном хосте, оно работает нормально. Но когда я развертываю приложение на удаленном сервере, оно перестает работать каждый раз, когда пользователь получает доступ к определенному действию, с ошибками:

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) не имеет конструктора. Я думаю, что причина может быть правильной, но как она может объяснить, что веб-приложение прекрасно работает на моем локальном сервере?

Я попытался найти, чтобы узнать, поддерживает ли ModelAttribute примитивный тип данных, но безрезультатно. У кого-нибудь есть опыт по этому вопросу?

1 Ответ

5 голосов
/ 13 июля 2011

Я просто добавляю некоторые мысли, надеясь, что это может немного помочь.

Трассировка стека показывает, что он действительно пытается вызвать метод конструктора долго:

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

Будет ли работать, если вы измените используемый тип с long на Long?

Что касается вещей, работающих локально, но не на клиенте.Версия Java такая же?

...