You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I use MvcUriComponentsBuilder.fromMethodCall(...) to compute paths to controller endpoints and include them in view models. In my controllers, the path usually is configured on the controller level (via @RequestMapping annotation). The controller methods are annotated with empty @GetMapping, @PostMapping, or similar annotations.
After upgrading to spring-boot 3 (spring 6) the computed paths do not work anymore, because they contain a trailing slash, which is no longer accepted due to the deactivated/deprecated trailing slash matching configuration in spring 6.
Debugging into the MvcUriComponentsBuilder I found the following method, which seems to cause this (now incompatible) behavior:
private static String getMethodMapping(Method method) {
Assert.notNull(method, "'method' must not be null");
RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(method, RequestMapping.class);
if (requestMapping == null) {
throw new IllegalArgumentException("No @RequestMapping on: " + method.toGenericString());
}
String[] paths = requestMapping.path();
if (ObjectUtils.isEmpty(paths) || !StringUtils.hasLength(paths[0])) {
return "/";
}
if (paths.length > 1 && logger.isTraceEnabled()) {
logger.trace("Using first of multiple paths on " + method.toGenericString());
}
return paths[0];
}
In my case, requestMapping.path() returns an empty array (which seems to be correct because the method level request mapping contains no path). But this leads to the method returning a single slash, which is added to the path that is taken from the controller level annotation (in the fromMethodInternal method).
When I move the path configuration into the method level annotations, everything works fine.
The text was updated successfully, but these errors were encountered:
rstoyanchev
changed the title
MvcUriComponentsBuilder adds trailing slash if path is defined at controller level
MvcUriComponentsBuilder adds trailing slash if path is defined at controller level only
Jan 31, 2023
Affects: spring-webmvc 6.0.4
I use
MvcUriComponentsBuilder.fromMethodCall(...)
to compute paths to controller endpoints and include them in view models. In my controllers, the path usually is configured on the controller level (via@RequestMapping
annotation). The controller methods are annotated with empty@GetMapping
,@PostMapping
, or similar annotations.After upgrading to spring-boot 3 (spring 6) the computed paths do not work anymore, because they contain a trailing slash, which is no longer accepted due to the deactivated/deprecated trailing slash matching configuration in spring 6.
Debugging into the
MvcUriComponentsBuilder
I found the following method, which seems to cause this (now incompatible) behavior:In my case,
requestMapping.path()
returns an empty array (which seems to be correct because the method level request mapping contains no path). But this leads to the method returning a single slash, which is added to the path that is taken from the controller level annotation (in thefromMethodInternal
method).When I move the path configuration into the method level annotations, everything works fine.
The text was updated successfully, but these errors were encountered: