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

时间:2017-07-06 10:13:31

标签: java spring rest spring-mvc spring-cloud-sleuth

我目前正在使用Spring Cloud Sleuth开发一个监控应用程序。目前,我尝试尽可能多地收集有关我的请求的信息。

为了使方法尽可能可扩展,我使用GenericFilterBeansHandlerInterceptorAdapter来访问发送到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*/
}

问题不在于,这样做是否是好的做法。问题是是否存在类似于Filter或Interceptor(或正确使用它们)的方法来访问这些参数。

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

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

2 个答案:

答案 0 :(得分:1)

虽然没有得到官方支持(因为它没有在参考文档中编写),但Spring MVC将该信息保存为请求属性。

您可以在侦探一号之后立即创建自己的HandlerInterceptor,并从请求中获取此信息,如下所示:

// "/{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);

注意,模板变量已经在那时被解码,这可能是你想要的。

答案 1 :(得分:0)

您可以创建一个拦截所有请求的过滤器。

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

  • 查询参数
  • 请求正文
  • URL
  • 标头参数

您可以根据需要保存所有这些数据。 这是你能做到的最佳方式。

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