《標記》-在自定義的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


發佈了311 篇原創文章 · 獲贊 2448 · 訪問量 257萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章