Как заставить URIBuilder.path (…) кодировать такие параметры, как «% AD»? Этот метод не всегда правильно кодирует параметры в процентах

Как заставитьURIBuilder.path(...) кодировать параметры как?"%AD"

Методы,pathreplacePath а также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"каждый раз, когда я вызываю методы,queryParamreplaceQueryParam или же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)

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