Я думаю, что ваша проблема здесь в том, что RFC 3986 , на котором основаны UriComponents
и, соответственно, UriTemplate
, не не требует экранирования +
вСтрока запроса.
Представление спецификации на это просто:
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
query = *( pchar / "/" / "?" )
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
Если ваш веб-фреймворк (например, Spring MVC!) интерпретирует +
как пробел, то этоего решение и не требуется согласно спецификации URI.
С учетом вышеизложенного вы также увидите, что !$'()*+,;
не может быть экранировано UriTemplate
.=
и &
являются экранированными, потому что Spring принял «самоуверенное» представление о том, как выглядит строка запроса - последовательность пар ключ = значение.
Аналогично, #[]
и пробелы экранированы, потому что они недопустимы в строке запроса согласно спецификации.
Конечно, ничего из этого не будет для вас утешением, если вы просто достаточно разумно хотите, чтобы вашпараметры запроса экранированы!
Чтобы фактически закодировать параметры запроса, чтобы ваша веб-инфраструктура могла их терпеть, вы можете использовать что-то вроде org.springframework.web.util.UriUtils.encode(foo, charset)
.