У меня есть небольшая проблема здесь.При создании запроса я хочу подписать все сообщение с помощью HMAC и добавить полученную подпись к заголовкам.
Итак, я реализовал
javax.ws.rs.ext.WriterInterceptorContext
В
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException
метод я не могу получить доступ к строковому представлению объекта.Всегда возвращает пустую строку.Кажется, причиной является MessageBodyWriter, который выполняется ПОСЛЕ WriterInterceptor.
В основном у меня следующие два сценария сбоя:
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
try {
final ClientOutputStream stream = (ClientOutputStream) requestContext.getProperty(HTTPCLIENT_ENTITY_STREAM);
String payload = stream.getString(Charset.forName("UTF-8")); // returns alway empty String
String signature = doSomeSuffWithPayload(payload);
MultivaluedMap<String, Object> headers = context.getHeaders();
headers.add(HmacHeaderValue.X_SIGNATURE.headerName(), signature);
context.proceed();
} catch (IllegalArgumentException | ParseException | InvalidKeyException | NoSuchAlgorithmException ex) {
LOGGER.error(ex.getMessage());
} catch (UnsupportedEncodingException ex) {
LOGGER.error(ex.getMessage());
} catch (IOException ex) {
LOGGER.error(ex.getMessage());
}
}
Здесь метод doSomeSuffWithPayload (payload) не работает, потому чтополезная нагрузка всегда пуста.
Я думал, что уловка сделает это, поэтому я переключил вызов context.proceed () на любое другое место:
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
try {
context.proceed();
final ClientOutputStream stream = (ClientOutputStream) requestContext.getProperty(HTTPCLIENT_ENTITY_STREAM);
String payload = stream.getString(Charset.forName("UTF-8")); // returns the right string representation
String signature = doSomeSuffWithPayload(payload);
MultivaluedMap<String, Object> headers = context.getHeaders();
headers.add(HmacHeaderValue.X_SIGNATURE.headerName(), signature); // doesn't add the header
} catch (IllegalArgumentException | ParseException | InvalidKeyException | NoSuchAlgorithmException ex) {
LOGGER.error(ex.getMessage());
} catch (UnsupportedEncodingException ex) {
LOGGER.error(ex.getMessage());
} catch (IOException ex) {
LOGGER.error(ex.getMessage());
}
}
В этом случае строковое представлениесущность в порядке.Но добавление заголовка к запросу не работает.
Таким образом, я могу добавить (неверную) подпись в заголовки и всегда пустую сущность ИЛИ правильную подпись с правильной сущностью, но заголовокне добавлено.
Мой вопрос: кто-нибудь знает способ получить строковое представление сущности с помощью WriterInterceptor?
EDITH сказал:
Мы используем версию2.25.1 Джерси клиента.2.27 тоже не решила проблему.