如何防止@ModelAttribute在方法中实例化日历

时间:2011-02-11 10:47:15

标签: java spring spring-mvc

我在控制器中有一个方法:

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

正如您所看到的,我创建了一个@HttpSessionParam注释,这将从HttpSession获取一个变量并将其放入指定的方法参数中。

...然而

在解析参数之前,我收到一个InstantiationExceptionConstructorAccessorImpl,因为默认构造函数无法实例化日历。

使用给定的堆栈跟踪,我看到“resolveModelAttribute”中的HandlerMethodInvoker导致实例化。

我该如何防止这种情况?我不想要实例化,我想使用自己的WebArgumentResolver来填充方法参数。

任何线索?

更多信息: Spring的Stacktrace(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 个答案:

答案 0 :(得分:1)

看起来您的参数解析器未被触发或未解决该参数。确保:

  • 您的解析器已正确传递到AnnotationHandlerMethodAdapter
  • 如果你的解析器被解雇,它会正确解析参数

答案 1 :(得分:1)

看起来像axtavt是正确的,部分原因。 WebArgument没有得到解决。但是,它是在xml上下文中正确定义的。那么为什么它不起作用?

application-context.xml包含一个mvc-context.xml(使用import标签)。在mvc-context.xml中我定义了bean等。

将bean定义移到mvc-context.xml之外,在import标记之上,使Spring'注意'bean并以适当的顺序解析。

进一步看,只要我的sessionParamResolver bean定义在上面标签,就可以了。将我的bean放在此标记下方时,它不起作用。

查看Spring documentation,在第15.12章配置Spring MVC,据说它将定义一个AnnotationMethodHandlerAdapter。所以我想事先定义它确保它也使用你的customArgumentResolvers。