Я ищу подходящий способ: в приложении Джерси, чтобы прочитать заголовок из входящего запроса и автоматически установить его в любые исходящие запросы, которые могут быть сделаны клиентом JAX-RS, используемым моим приложением.
В идеале я бы хотел сделать это, не загрязняя любую внутреннюю логику моих классов, поэтому с помощью различных фильтров и перехватчиков.
В простых случаях я могу это сделать: у меня есть реализация ClientRequestFilter
, которую я регистрирую на своем ClientBuilder
, и эта реализация фильтра имеет:
@Context
private HttpHeaders headers;
... который является контекстно-зависимым прокси (по определению), поэтому в своем методе filter
он может ссылаться на заголовки, которые присутствовали во входящем запросе, которые управляют всем этим, и устанавливать их на исходящий запрос. Для простых случаев это работает нормально.
Однако это не выполняется в случае асинхронности: если я использую асинхронные клиентские API JAX-RS для создания пучки GET
s, фильтр все равно вызывается, но больше не может вызывать методы на этом headers
переменная экземпляра; Джерси жалуется, что, насколько он знает, мы больше не занимаемся поиском. Это имеет смысл, если область запроса определена как потоковая: порожденная GET
работает где-то в некотором управляемом Джерси потоке, а не в том же потоке, что и прокси-сервер headers
, так что proxy выбрасывает IllegalStateException
повсюду, когда мой фильтр пытается поговорить с ним.
Я чувствую, что есть некоторая комбинация ContainerRequestFilter
и ClientRequestFilter
, которая должна быть в состоянии выполнить работу даже в асинхронных случаях, но я ее не вижу.