Этот вопрос немного старше, но все же ответ может помочь другим.Мой пример также зависит от Commons-Io.
Вы можете создать ContainerRequestFilter и использовать TeeInputStream для прокси / копирования исходного InputStream:
@Provider
@Priority(Priorities.ENTITY_CODER)
public class CustomRequestWrapperFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
ByteArrayOutputStream proxyOutputStream = new ByteArrayOutputStream();
requestContext.setEntityStream(new TeeInputStream(requestContext.getEntityStream(), proxyOutputStream));
requestContext.setProperty("ENTITY_STREAM_COPY", proxyOutputStream);
}
}
И использовать @Inject с javax.inject.Providerв вашем ExceptionMapper для получения инъекции ContainerRequest.
ExceptionMapper будет выглядеть так:
@Provider
public class BaseExceptionMapper implements ExceptionMapper<Exception> {
@Inject
private javax.inject.Provider<ContainerRequest> containerRequestProvider;
@Override
public Response toResponse(Exception exception) {
ByteArrayOutputStream bos = (ByteArrayOutputStream) containerRequestProvider
.get().getProperty("ENTITY_STREAM_COPY");
String requestBody = bos.toString();
...
}
}
Когда я также использовал аннотацию @Component, мой ExceptionMapper не использовался.Я думаю, что @Provider достаточно.