2012-08-15 103 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中放置一个断点,然后沿着堆栈中的流程进行操作。