Как заставить 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 (char)" возвращает 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?

Должен ли я выбрать другой подход?

Ответы на вопрос(3)

Ваш ответ на вопрос