贾琳 一名系统架构师的征途

shan9liang==善久良==永远保持善良……

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

为什么要读取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


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shan9liang/article/details/45403079
个人分类: Web开发 Spring AOP
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭