I have a HttpExchange client for e.g. BitBucket server, where the client looks like this:

public interface BitbucketClient {

    @GetExchange("/projects/{project}/repos/{repo}/raw/{path}?at={ref}")
    String raw(@PathVariable String project, @PathVariable String repo, @PathVariable String ref, @PathVariable String path);

}

path parameter can contain slashes (/) - because it is a path inside a repo (e.g. src/main/resources/file.txt) so encoding it breaks the API.

It would be good to have a param in PathVariable that would disable encoding (e.g. @PathVariable(encode = false) String path).

(this was reported earlier at #32041 but it stalled)

Comment From: rstoyanchev

It is not easy to do as proposed. Method parameter annotations are intentionally shared for client and server side (it's an HTTP Service contract neutral to either), but this would make it asymmetric. Also, no way to set per variable encoding options at the level of UriComponentsBuilder.

One way to do it is by passing a UriBuilderFactory that's configured accordingly, e.g. to encode the template only, or not at all (see encodingMode property on DefaultUriBuilderFactory). There is more context (and snippets) in the issue where support for this parameter was added #30935 (the docs don't cover this, something to correct).