javaspringrestspring-mvcrequest-mapping

Matching anything in Spring RequestMapping


On Spring MVC rest service I am having issues trying to match anything that is beyond my configured RequestMapping value.

So for e.g. I have this:

@RequestMapping(value = "{configKey}/{arguments:.*}", method = RequestMethod.GET)

Which says that match anything that is beyond the second path variable. The problem is that this e.g. works ok with:

get("/test/document")

while this ends up with 404:

get("/test/document/download")

It is weird that Spring can't handle this regex. I actually tried a lot of solutions, but none of them worked.

Previously I had this configuration on JAX-RS:

@Path("/{configKey}/{arguments:.*}")

And everything was good, but now I am migrating and having this issue.

Does anyone know what's going on and how to fix this?

EDIT:

Adding {configKey}/** - doesn't work

Adding {configKey}/{arguments}/** works, but for e.g. if I call:

get("/test/document/download") I get only test as my config key and document as arguments. In the arguments I expect to get all what's beyond the {configKey}. Which can be anything for e.g. it should work in any case:

get("/test/document")
get("/test/document/download")
get("/test/document/download/1")
get("/test/document/download/1/2")
get("/test/whatever/xxx/1/2/etc")

Which was working with config for JAX-RS: @Path("/{configKey}/{arguments:.*}")


Solution

  • I found a workaround to it, it's not the permanent solution, I think it's a bug in Spring and I raised a Jira, but until it's fixed here it is:

    I had to define my request mapping like this:

    @RequestMapping(value = "{configKey}/**", method = RequestMethod.GET)
    

    So basically match all what's after first variable in a path.

    Then:

    String arguments = pathMatcher.extractPathWithinPattern(
            request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString(),
            request.getPathInfo());
    

    Where a pathMatcher is an instance of AntPathMatcher used by Spring.

    So now calling HTTP GET on for e.g. this path:

    get("/test/leaderboard/user/mq/frankie1")
    

    I have:

    configKey = test
    arguments = leaderboard/user/mq/frankie1