【发布时间】:2014-01-30 14:32:14
【问题描述】:
我在从 Spring 3.0 升级到 4.0 时遇到此异常
我用这个link更新了已弃用的类
DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter 与 RequestMappingHandlerMapping ,RequestMappingHandlerAdapter
java.lang.ClassCastException: AuditingController$$EnhancerByCGLIB$$992fb2c8 cannot be cast to org.springframework.web.method.HandlerMethod
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
这是 bean 的定义
<bean name="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<array>
....
....
</array>
</property>
</bean>
在我的测试用例中调用这个函数。
handlerAdapter.handle(request, response, controller);
调用org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter
return handleInternal(request, response, (HandlerMethod) handler);
这里无法将控制器转换为HandlerMethod
【问题讨论】:
-
您的测试用例是错误的,处理
@RequestMethod注释的方法已经从AnnotationMethodHandlerAdapter到RequestMappingHandlerAdapter发生了相当大的变化。它现在直接指向要调用的方法(即HandlerMethod),因此将您的完整控制器放在那里不再起作用, -
你为什么还要测试 Spring 类?你应该测试你的
@Controllerbean。这些HandlerAdapter对象由 Spring 的DispatcherServlet堆栈(和 MVC 配置)使用。您应该假设它们可以工作并测试您自己的代码。 -
@SotiriosDelimanolis - 我正在测试我的控制器本身。不测试春季课程。我正在使用
MockHttpServletRequest, MockHttpServletResponse, HandlerAdapter并测试响应数据 -
我想说的是你不应该这样做。使用 Spring MVC 的全部意义在于通过
DispatcherServlet。如果您要绕过DispatcherServlet,您并没有真正测试您的控制器。只需从您的 MVC 配置中设置一个MockMvc对象并通过那里测试您的请求。
标签: java spring spring-mvc classcastexception spring-4