《标记》-在自定义的Spring拦截器中通过request获取到该请求对应于Controller中的目标method方法对象

本文记录了在自定义的Spring拦截器中尝试获取请求对应Controller方法时遇到的问题及解决方案。当尝试将Controller类转换为HandlerMethod时,出现ClassCastException。错误源于使用了DefaultAnnotationHandlerMapping,需替换为RequestMappingHandlerMapping。配置更改后,虽然解决了转换问题,但又出现了找不到适配器的问题。解决办法是确保Controller实现了一个支持的接口,如Controller。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要读取method方法对象?
当然拿到Method对象我们可以做很多事,例如 权限认证的时候,判断用户是否有访问该方法的权限。

spring-webmvc-3.1.0.RELEASE及以上版本
最终配置--------------------------------------------begin
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
<property name="interceptors">
<list>
<bean class="com.chenzhou.examples.erm.util.interceptor.LoginInterceptor"/>
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

//spring自己的拦截器,测试
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
System.out.println("*********************preHandle********************");
System.out.println(handler.getClass());
HandlerMethod handlerMethod = (HandlerMethod) handler;
System.out.println(handlerMethod.getMethod());
return true;
}

最终配置--------------------------------------------end


可能的错误
  1. *********************preHandle********************  
  2. class com.chenzhou.examples.erm.web.AdminController  
  3. 2012-10-21 16:28:25 org.apache.catalina.core.StandardWrapperValve invoke  
  4. 严重: Servlet.service() for servlet erm threw exception  
  5. java.lang.ClassCastException: com.chenzhou.examples.erm.web.AdminController cannot be cast to org.springframework.web.method.HandlerMethod  
  6.     at com.chenzhou.examples.erm.util.interceptor.LoginInterceptor.preHandle(LoginInterceptor.java:37)  
  7.     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:891)  
  8.     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)  
  9.     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)  
  10.     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)  
  11.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  
  12.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
  13. ……  

 

    根据错误提示可以看出是HandlerMethod handlerMethod = (HandlerMethod) handler;这一步报错了,根据System.out.println(handler.getClass());打印的结果可以得知handler是该请求访问的Controller类,无法转换成HandlerMethod对象。解决方案是使用

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
替换 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> 

因为DefaultAnnotationHandlerMapping只能返回Controller对象,不会映射到Controller中的方法级别。替换之后配置如下:

 

  1. <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />   
  2. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>  
  3. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">   
  4.     <property name="interceptors">  
  5.         <list>  
  6.             <bean class="com.chenzhou.examples.erm.util.interceptor.LoginInterceptor"/>  
  7.         </list>  
  8.     </property>  
  9. </bean>  

 

    重启tomcat测试之后发现再次报错,报了另外一个错误,具体信息如下:

 

  1. 2012-10-21 16:39:39 org.apache.catalina.core.StandardWrapperValve invoke  
  2. 严重: Servlet.service() for servlet erm threw exception  
  3. javax.servlet.ServletException: No adapter for handler [public org.springframework.web.servlet.ModelAndView com.chenzhou.examples.erm.web.AdminController.init(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)]: Does your handler implement a supported interface like Controller?  
  4. ……  

 

    这一次,请求根本没有到达拦截器容器就已经报错了,错误提示的意思是找不到handler对象对应的Adapter类。我在RequestMappingHandlerMapping类对应的spring-webmvc-3.1.0.RELEASE.jar 包里找到了该类对应的Adapter类:RequestMappingHandlerAdapter


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值