我正在尝试向 Spring MVC 应用程序添加一些指标收集。假设我有一个控制器,其映射为:
/User/{username}/Foobar
我想使用路径收集所有控制器映射调用的指标。现在我可以创建一个处理程序/拦截器并查看请求,但这会给我:
/User/Charlie/Foobar
这不是我想要的。我希望控制器映射本身记录。而且我不想为每个控制器添加一些东西。如果我能提供帮助,我也宁愿不使用 AOP。
我正在尝试向 Spring MVC 应用程序添加一些指标收集。假设我有一个控制器,其映射为:
/User/{username}/Foobar
我想使用路径收集所有控制器映射调用的指标。现在我可以创建一个处理程序/拦截器并查看请求,但这会给我:
/User/Charlie/Foobar
这不是我想要的。我希望控制器映射本身记录。而且我不想为每个控制器添加一些东西。如果我能提供帮助,我也宁愿不使用 AOP。
事实证明,Spring 将最匹配的控制器模式挂在请求本身上。您可以像这样从处理程序拦截器中获取它:
(String)request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)
我可以想到两个选择:
在我看来,匹配的结果是在类中获得的org.springframework.web.servlet.handler.AbstractUrlHandlerMapping
,它记录了获得的模式(见第 266 行)。我会尝试为该类启用日志记录,看看输出是否对您的目的有帮助。
(复杂)
扩展org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
以覆盖lookupHandler
继承自AbstractUrlHandlerMapping
并记录/注册您需要的方法。根据此类文档,您可以注册一个不同的文档,以便DispatcherServlet
使用您的版本。
在 Spring 3.2.xDefaultAnnotationHandlerMapping
中已弃用,因此必须使用不同的类。