2011-06-23 38 views
2

我有一個自定義註釋,我在Controller中和@ReqestMapping一起註釋了一個方法。從攔截器上使用Spring MVC控制器方法上的自定義註釋

目標是使用HandlerInterceptor中的自定義註釋中設置的值來執行任務。

我有攔截器(HandlerInterceptorAdaptor)映射並執行。如果我在具體的Interceptor中設置斷點,我可以檢查HttpServletRequest,HttpServletResponse和處理程序對象。但是,我看不到如何1,獲取請求試圖訪問的方法2,獲取該方法的註釋和3,當然,獲取註釋設置的值。

任何人都可以指出我的好文檔嗎?

請和謝謝你。

回答

4

在Spring 3.1中,我們引入了HandlerMethod抽象來表示將處理請求的特定控制器方法。有HandlerMapping和HandlerAdapter專門爲此。您可以在M2發佈後的博文中詳細瞭解這一點。

https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements/

春3.1不釋放GA呢。當然,它可以作爲里程碑版本,也可以作爲夜間快照。無論哪種方式,這是你應該考慮的,因此值得一提。

+0

感謝您的回覆。我們可能無法升級到3.1版GA之前,但需要牢記。 – Speck

0

你看過反射嗎?

http://java.sun.com/developer/technicalArticles/ALT/Reflection/

例如

Class classVar = Class.forName("java.lang.String"); 

    // getDeclaredFields() returns all the constructors 
    Constructor cnstArray[] = classVar.getConstructors(); 

    // getFields() returns the declared fields 
    Field fldArray[] = classVar.getDeclaredFields(); 

    // getMethods() returns the declared methods of the class. 
    Method mtdArray[] = classVar.getMethods(); 
1

請張貼代碼樣本,以便我們能夠更好地理解你想解決什麼問題。

鑑於目前爲止描述的內容,我不認爲這是HandlerInterceptor的用途。它應該用於交叉切割問題,但很難從問題描述中知道什麼是交叉切割。如果您想將邏輯與控制器綁定,那麼爲什麼不直接修改控制器?這聽起來像修改與控制器緊密耦合,但沒有更多的細節,這很難說。這就是說,這裏有一個相關的問題和答案:HandlerMethod given a HttpRequest?

使用AOP可以讓你成爲那裏的一部分 - 至少你會知道更多關於被調用的控制器方法。更多信息:Spring AOP pointcut that matches annotation on interface

+0

「爲什麼不直接修改控制器」 - 我們的想法是將對控制器的修改限制爲僅註釋控制器方法。我看着另一個問題,它確實解決了我的擔憂,可悲的是它說:「你不能那樣做。」 – Speck

4

AOP將非常適合您。您應該能夠編寫一個執行您的任務的建議,其中一個連接點定義捕獲被調用控制器的上下文 - 您擁有的任何自定義註釋以及傳遞的參數。

+0

+1,我已經做到了,並且效果很好。 – Kevin

1

由於HandlerMapping不知道,所以無法確定它將從攔截器內實際調用的處理程序的哪個方法。這個邏輯全都埋在AnnotationMethodHandlerAdapter之內,它並沒有真正的擴展點。如果您需要攔截器中的信息,則需要實施一種方法來根據您的控制器結構找出將要調用的方法。

相關問題