当前位置: 首页 > 知识库问答 >
问题:

Spring HandlerMapping.best_matching_pattern_attribute不总是设置

东郭自珍
2023-03-14

我很好奇,如果有人能分享一些关于为什么HttpServletRequest可能没有从Spring框架中设置特定属性的反馈。我们使用handlermapping.best_matching_pattern_attribute键控关闭的属性。(https://docs.spring.io/spring-framework/docs/4.3.4.release/javadoc-api/org/springframework/web/servlet/handlermapping.html)

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
    throws ServletException, IOException {
    String path = (new UrlPathHelper()).getPathWithinApplication(request);
    chain.doFilter(request, response);
    String scrubbedPath = scrubPath(request, path);
}

private String scrubPath(HttpServletRequest request, String path) {
    String message = "Response Metric Info";
    String scrubbedPath = path;
    Object bestMatchingPattern = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
    if (bestMatchingPattern != null) {
        //This changes path from .../collection/{alias} to ../collection/alias
        scrubbedPath = fixSpecialCharacters(bestMatchingPattern.toString());
    } else {
        // this is temporary to help with understanding why we get multiple metric names for the same path
        message = "BEST_MATCHING_PATTERN_ATTRIBUTE null";
    }

    logHandlerInfo(message, request, path);

    return scrubbedPath;
}

// temp helper method to understand why some metrics are being formatted differently for the same path
// causing multiple metrics for the same path
private void logHandlerInfo(String message, HttpServletRequest request, String path) {
    final String LINE_SEPARATOR = System.lineSeparator();
    StringBuilder metricInfoBuilder = new StringBuilder();
    metricInfoBuilder.append(message);
    metricInfoBuilder.append(LINE_SEPARATOR).append(String.format("Input Path=%s", path));
    metricInfoBuilder.append(LINE_SEPARATOR).append(String.format("HandlerMapping.Path=%s", request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)));
    metricInfoBuilder.append(LINE_SEPARATOR).append(String.format("HandlerMapping.Best=%s", request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)));
    metricInfoBuilder.append(LINE_SEPARATOR).append(String.format("HandlerMapping.Introspect=%s", request.getAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING)));
    metricInfoBuilder.append(LINE_SEPARATOR).append(String.format("HandlerMapping.UriTemplate=%s", request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE)));
    metricInfoBuilder.append(LINE_SEPARATOR).append(String.format("HandlerMapping.Matrix=%s", request.getAttribute(HandlerMapping.MATRIX_VARIABLES_ATTRIBUTE)));
    metricInfoBuilder.append(LINE_SEPARATOR).append(String.format("HandlerMapping.MediaTypes=%s", request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE)));
    log.info(metricInfoBuilder.toString());
}

下面是示例日志。

2018-10-08 20:51:58:300 [qtp1346560976-53746897] []  INFO  c.e.m.e.metrics.MetricsFilter - Response Metric Info
Input Path=/v1/group/test/collection/test-dev/status
HandlerMapping.Path=/v1/group/test/collection/test-dev/status
HandlerMapping.Best=/v1/group/{groupAlias}/collection/{alias}/status
HandlerMapping.Introspect=null
HandlerMapping.UriTemplate={groupAlias=test, alias=test-dev}

2018-10-08 20:46:57:745 [qtp1346560976-53746897] []  INFO  c.e.m.e.metrics.MetricsFilter - BEST_MATCHING_PATTERN_ATTRIBUTE null
Input Path=/v1/group/test/collection/test-dev/status
HandlerMapping.Path=null
HandlerMapping.Best=null
HandlerMapping.Introspect=null
HandlerMapping.UriTemplate=null

共有1个答案

夏侯林
2023-03-14

对于丢失的属性,要么不添加,要么稍后删除,这两种情况似乎都不太可能。为了进一步调试,我建议首先找出特定请求使用了哪个HandlerMapping,例如,通过为org.springframework.web设置要调试的日志级别。这将告诉您映射是否支持添加这些属性。如果它是上面提到的其中一个的子类,那么它应该添加它们。

 类似资料:
  • 问题内容: 我正在使用POI在Java中创建Excel电子表格。我有以下代码用于创建标题行: 我遇到的问题是,无论我选择哪种颜色,在单元格上设置填充背景颜色总是显示为黑色。我究竟做错了什么?如果我不使用“ setFillPattern”行,则完全不会显示颜色。 问题答案: 我有这个工作。我必须设置前景色以使背景色起作用(??)。 所以我改变了: 至: 而且有效!

  • 首先,我在https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer测试了教程 这很好用。我还测试了相同的教程,但添加了一个tls机密来测试https,这也很好。 当我创造自己的形象时,我的问题就出现了。以下是我采取的步骤: Dockerfile: 带命令: 我读过无数关于当你的后台状态为“不健康”时该怎么办的帖子

  • 我是个不和谐的新手。js和我有一个问题,我想移动到另一个语音频道的用户消息我的机器人。我已经尝试了很多东西,每次当我想从msg获取成员时,它都是空的,msg。公会也是空的,不知道为什么 我也尝试过,但仍然:TypeError:无法读取null的属性'成员'

  • 为什么?是否有其他方法将消息文本附加到TextAres,也许使用绑定?

  • 我发送我的代币作为改装的授权,但我总是得到401代码。但是如果我在邮递员中使用相同的令牌,我可以访问。我知道我能够访问webapi,因为我可以很好地登录,并且能够从webapi获取令牌。请参阅下面我的代码: ApiService接口 呼叫服务 ### = 2020-04-08 13:03:09.235 14185-14185/com.kotlin.ambulantlcsI/TAG:承载”eyJhb

  • 问题内容: 我能够成功获取经/纬度并将其传递给地址解析器以获取地址。但是,我并不总是找回地址。似乎需要尝试几次?我不知道为什么。 此时我是否有更好的方法来获取地址? 我在这里调用此方法: 问题答案: 根据我的经验,Google Geocoder并非总是能正常工作,我在地图上有几个固定点,当我点击叠加层时,它会弹出带有该经度/纬度地址的祝酒词,这些点不会改变,有时我在同一点上单击10次,但我只得到其