2012-08-15 74 views
0

我正在構建一個包含多個maven構件的應用程序。由於設計限制,其中一個工件意味着後端本質上無法訪問請求(因此不允許使用@RequestMapping)。實際情況是,有些請求需要直接連接到某些類的方法。Spring的@RequestMapping內部構造

我在春季做了一些深度潛水,遇到了我需要的一半來使它工作。簡單的部分是自己編寫一個HandlerMapping並正確配置它。該映射器將具有後端實體的知識以手動映射必要的URL。

我找不到tho的部分是什麼在Spring中調用?當你有例如:

@Component 
@RequestMapping("/mypath") 
public class MyStuff 
{ 
    @RequestMapping(value = "/dothis", method = RequestMethod.GET) 
    public ResponseEntity<String> doThis(HttpServletRequest request) 
    { 
    } 
} 

當一個請求到/ mypath中/ dothis,其對象,該對象請求並調用正確的豆中的正確方法攔截由?據我所知,映射器只返回映射到特定bean的所有 URL的字符串數組。約請求的攔截器

回答

3

在較高的水平,這是流量 - Spring的DispatcherServlet首先處理的要求 - 這是一個用在web.xml文件中的條目。

DispatcherServlet保持HandlerAdapters和的HandlerMappings的列表,對於該請求,它要求每個處理器映射爲處理程序

藉助於Spring 3.1中,主處理器映射實現的一個是其保持的請求URI的映射到RequestMappingHandlerMapping處理程序(這是一個HandlerMethod最終指向@RequestMapping映射方法)。

一旦處理程序被從獲得的HandlerMapping,DispatcherServlet的詢問每個的HandlerAdapter它是否可以處理該請求(HandlerAdapter.supports API),如果這樣做的請求被分派到適當的HandlerAdapter,這最終調用handlerMethod。使用Spring 3.1,與<mvc:annotation-driven/>註冊的主HandlerAdapter是RequestMappingHandlerAdapter

我認爲這應該足以開始進行更深入的調查。遵循流程的一個好方法是在DispatcherServlet中放置一個斷點,然後沿着堆棧中的流程進行操作。