Как предотвратить @ModelAttribute для создания экземпляра календаря в методе - PullRequest
3 голосов
/ 11 февраля 2011

У меня есть метод в контроллере:

public FormValidationResult submitFormAndSendEmail(@Valid ContactForm form, BindingResult result,
  @HttpSessionParam(value = "lastTimeContactFormSent", required = false) Calendar lastTimeContactFormSent)

Как вы можете видеть, я создал аннотацию @HttpSessionParam, она возьмет переменную из HttpSession и поместит ее в указанный параметр метода.

Однако ...

Перед разрешением аргумента я получаю InstantiationExceptionConstructorAccessorImpl, потому что календарь не может быть создан конструктором по умолчанию.

Используя данную трассировку стека, я вижу, чтоHandlerMethodInvoker внутри "resolModelAttribute" вызывает создание экземпляра.

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

Любые подсказки?

Дополнительная информация: Stacktrace by Spring (3.0.4):

    java.lang.InstantiationException
    at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:104)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:772)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:356)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:427)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:415)

Я не вижу, чтобы отладчик попал в webargumentresolver.

Аргумент определен в контексте моего приложения (xml) следующим образом:

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="customArgumentResolver" ref="sessionParamResolver"/>
</bean>  

<!--  annotation to resolve httpSession attributes -->
<bean id="sessionParamResolver" class="nl.usgpeople.vakgilde.spring.mvc.extensions.SessionParamArgumentResolver"/>

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Похоже, аксавт был прав, частично.WebArgument не был решен.Однако он был правильно определен в контексте xml.Так почему же это не работает?

В application-context.xml включен mvc-context.xml (с использованием тега import).В mvc-context.xml я определил бин и тому подобное.

Перемещение определения бина за пределы mvc-context.xml, над тегом импорта, заставило Spring «заметить» бин и разрешить его в соответствующем порядке..

Глядя дальше, похоже, что пока мой bean-компонент sessionParamResolver определен над тегом, он работает.При размещении моего bean-компонента под этим тегом он не работает.

Глядя на документацию Spring , в главе 15.12 Настройка Spring MVC, говорится, что он определит AnnotationMethodHandlerAdapter.Поэтому я предполагаю, что его предварительное определение гарантирует, что оно также использует ваши customArgumentResolvers.

1 голос
/ 11 февраля 2011

Похоже, ваш преобразователь аргументов не был запущен или не разрешил аргумент. Убедитесь, что:

  • Ваш распознаватель правильно передан AnnotationHandlerMethodAdapter
  • если ваш распознаватель запущен, он правильно разрешает аргумент
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...