Java 访问@RequestMapping映射的参数以进行跟踪

Java 访问@RequestMapping映射的参数以进行跟踪,java,spring,rest,spring-mvc,spring-cloud-sleuth,Java,Spring,Rest,Spring Mvc,Spring Cloud Sleuth,我目前正在使用SpringCloudSleuth开发一个监控应用程序。目前,我试图收集尽可能多的关于我的请求的信息 为了尽可能保持方法的可伸缩性,我使用GenericFilterBeans和HandlerInterceptorAdapter从发送到REST-API的请求中访问信息 我正在努力获取REST调用的参数,其中的参数是从URL映射的,如以下代码段所示: @RequestMapping( value = {"/{service}/{route_id}/book"

我目前正在使用SpringCloudSleuth开发一个监控应用程序。目前,我试图收集尽可能多的关于我的请求的信息

为了尽可能保持方法的可伸缩性,我使用
GenericFilterBeans
HandlerInterceptorAdapter
从发送到REST-API的请求中访问信息

我正在努力获取REST调用的参数,其中的参数是从URL映射的,如以下代码段所示:

  @RequestMapping(
            value = {"/{service}/{route_id}/book", "/accounting-core-service/{service}/{route_id}/book"},
            method = RequestMethod.GET)
    @ResponseBody
    public ModelAndView book(@PathVariable(value="service") String serviceName,
                             @PathVariable(value = "route_id") int routeId,
                             HttpServletResponse response) {
    /*Do something*/
}
问题不是,这样写是否是好的做法。问题是是否有类似于过滤器或拦截器(或正确使用它们)的方法来访问这些参数

一个要求是,通过添加很少的代码行,可以轻松地将其应用于应用程序。手动注释每个方法调用或手动插入代码以将参数从方法中写入跟踪对我来说是不可行的


如果您需要更多信息,请随时询问。我将向您提供帮助我解决问题所需的所有信息。

您可以创建一个拦截所有请求的筛选器

对于每个请求,您还可以检索以下信息:

  • 查询参数
  • 请求正文
  • 网址
  • 标题参数
您可以根据需要保存所有这些数据。 这是最好的办法



如果您需要将所有url(如
/{service}/{route_id}/book
)分组到一个url“系列”中,您可以拆分url并检查它是否是该系列的一部分,但当在代码中添加新系列时,您需要更新过滤器(或在外部文件或数据库中配置某些内容)。

尽管不受官方支持(因为它没有写在参考文档中),SpringMVC将该信息作为请求属性保存

您可以创建自己的
HandlerInterceptor
,在Sleuth one之后订购,并从请求中获得如下信息:

// "/{service}/{route_id}/book"
String matchingPattern = (String) request
                    .getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
// "service" => "fooService", "route_id" => "42"
Map<String, String> templateVariables = (Map<String, String>) request
                    .getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
/“/{service}/{route\u id}/book”
字符串匹配模式=(字符串)请求
.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_属性);
//“服务”=>“fooService”,“路由id”=>“42”
映射模板变量=(映射)请求
.getAttribute(HandlerMapping.URI\u模板\u变量\u属性);

请注意,此时模板变量已经被解码,这可能正是您想要的。

我已经对请求进行了筛选。
request.getParameterMap()中的参数
可以很容易地提取。但是我需要一种通用的方法来访问这些映射参数。我说得对吗,除了在API中获取每个端点URL模式,然后在过滤器中添加手动映射逻辑以应用于随任何请求而来的URL之外,没有其他方法了?非常感谢您的解决方案。J出于好奇:这在GenericFilterBean中不起作用的原因是什么?我假设我在那里有相同的请求。但是测试它没有显示参数的结果。知道吗?作为一个普通的Servlet过滤器,我猜它是在处理程序映射发生之前应用的(在我们知道这个请求应该由Spring MVC处理程序处理之前),因此信息还不可用。这样的请求可以由另一个Servlet、Servlet容器提供的静态资源处理、另一个Servlet过滤器等来处理。