Spring的@RequestMapping内部

时间:2012-08-15 21:39:24

标签: java spring web http-request-parameters

我正在构建一个包含多个maven工件的应用。由于设计限制,其中一个工件本质上是后端,无法访问请求(因此不允许使用@RequestMapping)。实际情况是,有些请求需要直接连接到其中一些类方法。

我在春季做了一些深度潜水,并且遇到了我需要的一半才能使它发挥作用。最简单的部分是自己编写HandlerMapping并正确配置它。该映射器将了解后端实体以手动映射必要的URL。

我找不到的部分是Spring中的哪些(什么)管理调用?例如:

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

当向/ mypath / dothis发出请求时,哪个对象拦截该请求并在正确的bean中调用正确的方法?据我所知,映射器只返回映射到特定bean的所有 url的字符串数组。

2 个答案:

答案 0 :(得分:3)

在高水平这是流动 - Spring的DispatcherServlet首先处理请求 - 这是在web.xml文件中有一个条目的请求。

DispatcherServlet维护一个HandlerAdapters和HandlerMappings列表,对于请求,它要求每个handlerMapping一个处理程序

使用Spring 3.1,其中一个主要的handlerMapping实现是RequestMappingHandlerMapping,它维护请求uri到处理程序的映射(最终指向@RequestMapping映射方法的HandlerMethod)。

一旦从HandlerMapping获得处理程序,DispatcherServlet会询问每个handlerAdapter是否可以处理请求(HandlerAdapter.supports api),如果是,则将请求分派给相应的HandlerAdapter,最终调用handlerMethod。在Spring 3.1中,使用<mvc:annotation-driven/>注册的主HandlerAdapter为RequestMappingHandlerAdapter

我认为这应该是进行更深入调查的充分开始。遵循这个流程的一个好方法是在DispatcherServlet中放置一个断点并跟踪堆栈中的流程。

答案 1 :(得分:0)

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html

请参阅第16.4节关于请求拦截器的内容。您应该可以使用它来映射到您的班级。

相关问题