Although https://github.com/spring-projects/spring-framework/issues/33444 has been fixed for root URLs, it looks like there is still a problem with the UrlHandlerFilter when server.servlet.contextPath is specified.
Here is a minimal application to reproduce it: https://github.com/bdshadow/SpringTrailingSlashTestProject
server.servlet.contextPath=/myApp
And use the following UrlHandlerFilter:
UrlHandlerFilter filter = UrlHandlerFilter
.trailingSlashHandler("/**").wrapRequest()
.build();
And in this case, both http://localhost:8080/myApp/greeting and http://localhost:8080/myApp/greeting work fine, however,
http://localhost:8080/myApp and http://localhost:8080/myApp/ don't and return 404.
Controller for the root looks like this:
@RestController
@RequestMapping("/")
public class MyController {
@GetMapping(value = {"/", "greeting"})
public String greeting() {
return "Hello world!";
}
}
Comment From: rstoyanchev
You can map with "" which handles "/" as well. For example this works:
@RestController
public class MyController {
@GetMapping(value = {"", "greeting"})
public String greeting() {
return "Hello world!";
}
}
However, if you configure UrlHandlerFilter to redirect, it would send "/myApp/" to "/myApp", which would work for the request mappings, but Tomcat redirects "/myApp" back to "/myApp/". And in any case, I think the UrlHandlerFilter should makes checks on the pathWithinApplication, excluding the contextPath.