В настоящее время я разрабатываю REST API, используя RestEasy
и Jetty
. Один из моих планов с этим REST API — создать плагин-ловушку, чтобы делать все необходимое с входящим запросом, используя JAX-RS ContainerRequestFilter
. Дело с ContainerRequestPlugin
в Jetty
здесь заключается в том, что после того, как я вызвал requestContext.getEntityStream();
в фильтре, мой класс EndPoint не сможет снова прочитать запрос, даже если я снова установил Entity Stream.
Ниже приведен мой код фильтра
@Provider
@Priority(2000)
public class DummyRequestFilter implements ContainerRequestFilter{
static Logger log = Logger.getLogger(DummyRequestFilter .class.getName());
@Context
private HttpServletRequest servletRequest;
@Override
public void filter(ContainerRequestContext requestContext) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String requestBody = "";
try {
IOUtils.copy(requestContext.getEntityStream(), baos);
InputStream is1 = new ByteArrayInputStream(baos.toByteArray());
InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
requestBody = IOUtils.toString(is1);
log.info(requestBody);
requestContext.setEntityStream(is2);
}catch (Exception e) {
log.log(Level.SEVERE,"Exception Occurred",e);
}
}
}
Тогда вот мой класс конечной точки
@Path("/")
public class DummyService {
Logger log = Logger.getLogger(DummyService .class.getName());
@GET
@Path("test")
@Produces(MediaType.APPLICATION_JSON)
public Response test(@FormParam("name") String name) {
log.info("Name = "+name);
return Response.status(200).build();
}
}
Всякий раз, когда я вызываю этот тестовый метод, я вижу имя, отправленное в классе Filter, но имя класса Endpoint — NULL
.
Позже я понял, что getEntityStream, возвращаемый из requestContext, является пользовательским ServletInputStream
Jetty, то есть org.eclipse.jetty.server.HttpInput
. Я считаю, что запрос не может быть прочитан в EndPoint, так как я установил Entity Stream, используя ByteArrayInputStream.
Итак, мой вопрос будет заключаться в том, есть ли способ создать/преобразовать Jetty HttpInput, используя общую реализацию InputStream? или есть другой способ обойти этот случай? где я могу много раз читать Jetty HttpInput?
С уважением