Как заставить URIBuilder.path (…) кодировать такие параметры, как «% AD»? Этот метод не всегда правильно кодирует параметры в процентах
Как заставитьURIBuilder.path(...)
кодировать параметры как?"%AD"
Методы,path
replacePath
а такжеsegment
изURIBuilder
не всегда правильно кодировать параметры в процентах.
Когда параметр содержит символ «%» за которыми следуют два символа, которые вместе образуют символ в кодировке URL, «%» не кодируется как "% 25" .
Например"
URI uri = UriBuilder.fromUri("https://dummy.com").queryParam("param", "%AD");
String test = uri.build().toString();
тестовое задание" является "https://dummy.com?param=%AD»
Но так и должно бытьhttps://dummy.com?param=%25AD» (с символом "%" закодировано как% 25" )
МетодUriBuilderImpl.queryParam(...)
ведет себя так, когда два символа, следующие за "%" шестнадцатеричные. Т.е. метод "com.sun.jersey.api.uri.UriComponent.isHexCharacter (символ)» возвращает true для символов, следующих за "%".
Я думаю, что поведение UriBuilderImpl является правильным, потому что я предполагаю, что он пытается не кодировать параметры, которые уже закодированы. Но в моем сценарии я никогда не буду пытаться создавать URL с параметрами, которые уже закодированы.
Что я должен делать?
Мое веб-приложение использует Джерси, и во многих местах я создаю URI с помощью класса UriBuilder или вызываю методgetBaseUriBuilder
изUriInfo
объекты.
Я могу заменить "%" с "% 25"каждый раз, когда я вызываю методы,queryParam
replaceQueryParam
или жеsegment
, Но я ищу менее громоздкое решение.
Как я могу заставить Джерси вернуть мою собственную реализацию UriBuilder?
Я думал о создании класса, который расширяет UriBuilderImpl, который переопределяет эти методы и выполняет эту замену перед вызовомsuper.queryParam(...)
или что угодно.
Есть ли способ заставить Джерси возвращать мой собственный UriBuilder вместо UriBuilderImpl при вызовеUriBuilder.fromURL(...)
, UriInfo.getBaseUriBuilder (...) и т. Д.?
Глядя на методRuntimeDelegate
Я думал о расширенииRuntimeDelegateImpl
, Моя реализация переопределит методcreateUriBuilder(...)
который вернул бы мой собственныйUriBuilder
, вместоUriBuilderImpl
, Затем я бы добавил файлMETA-INF/services/javax.ws.rs.ext.RuntimeDelegate
и в нем, полное имя класса моего.RuntimeDelegateImpl
Проблема в том, что jersey-bundle.jar уже содержитMETA-INF/services/javax.ws.rs.ext.RuntimeDelegate
это указывает наcom.sun.jersey.server.impl.provider.RuntimeDelegateImpl
Таким образом, контейнер загружает этот файл вместо моегоjavax.ws.rs.ext.RuntimeDelegate
, Поэтому он не загружает мойRuntimeDelegate
реализация.
Можно ли обеспечить мою собственную реализацию?RuntimeDelegate
Должен ли я выбрать другой подход?