У меня странная проблема с 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 примитивный тип данных, но безрезультатно. Есть ли у кого-нибудь опыт по этой проблеме?