Set best matching pattern attribute in WebMvc.fn
Prior to this commit, the `RouterFunctionMapping` WebFlux.fn variant would set the `HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE` as an exchange attribute. This is useful for instrumentation purposes. The WebMvc.fn variant would not do the same; this would lead to "UNKNOWN" path metrics tags. This commit ensures that the `RouterFunctionMapping` WebMvc.fn variant does set the `BEST_MATCHING_PATTERN_ATTRIBUTE` and `BEST_MATCHING_HANDLER_ATTRIBUTE` request attributes. Closes gh-26963
This commit is contained in:
@@ -34,10 +34,12 @@ import org.springframework.http.converter.support.AllEncompassingFormHttpMessage
|
||||
import org.springframework.http.converter.xml.SourceHttpMessageConverter;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.web.servlet.function.HandlerFunction;
|
||||
import org.springframework.web.servlet.function.RouterFunction;
|
||||
import org.springframework.web.servlet.function.RouterFunctions;
|
||||
import org.springframework.web.servlet.function.ServerRequest;
|
||||
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
|
||||
import org.springframework.web.util.pattern.PathPattern;
|
||||
import org.springframework.web.util.pattern.PathPatternParser;
|
||||
|
||||
/**
|
||||
@@ -50,6 +52,7 @@ import org.springframework.web.util.pattern.PathPatternParser;
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
* @author Sebastien Deleuze
|
||||
* @author Brian Clozel
|
||||
* @since 5.2
|
||||
*/
|
||||
public class RouterFunctionMapping extends AbstractHandlerMapping implements InitializingBean {
|
||||
@@ -206,16 +209,23 @@ public class RouterFunctionMapping extends AbstractHandlerMapping implements Ini
|
||||
protected Object getHandlerInternal(HttpServletRequest servletRequest) throws Exception {
|
||||
if (this.routerFunction != null) {
|
||||
ServerRequest request = ServerRequest.create(servletRequest, this.messageConverters);
|
||||
setAttributes(servletRequest, request);
|
||||
return this.routerFunction.route(request).orElse(null);
|
||||
HandlerFunction<?> handlerFunction = this.routerFunction.route(request).orElse(null);
|
||||
setAttributes(servletRequest, request, handlerFunction);
|
||||
return handlerFunction;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void setAttributes(HttpServletRequest servletRequest, ServerRequest request) {
|
||||
servletRequest.removeAttribute(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE);
|
||||
private void setAttributes(HttpServletRequest servletRequest, ServerRequest request,
|
||||
HandlerFunction<?> handlerFunction) {
|
||||
PathPattern matchingPattern = (PathPattern) servletRequest.getAttribute(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE);
|
||||
if (matchingPattern != null) {
|
||||
servletRequest.removeAttribute(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE);
|
||||
servletRequest.setAttribute(BEST_MATCHING_PATTERN_ATTRIBUTE, matchingPattern.getPatternString());
|
||||
}
|
||||
servletRequest.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, handlerFunction);
|
||||
servletRequest.setAttribute(RouterFunctions.REQUEST_ATTRIBUTE, request);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user