Saat ini saya sedang mengembangkan REST API menggunakan RestEasy
dan Jetty
. Salah satu rencana saya dengan REST API ini adalah membuat plugin hook untuk melakukan apa pun yang diperlukan dengan permintaan masuk menggunakan JAX-RS ContainerRequestFilter
. Masalahnya dengan ContainerRequestPlugin
di Jetty
di sini adalah setelah saya memanggil requestContext.getEntityStream();
di Filter maka permintaan tersebut tidak akan dapat dibaca lagi oleh Kelas EndPoint saya meskipun saya telah mengatur Aliran Entitas lagi.
Berikut ini adalah kode Filter saya
@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);
}
}
}
Lalu inilah kelas titik akhir saya
@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();
}
}
Setiap kali saya memanggil metode pengujian ini saya dapat melihat nama yang dikirim di kelas Filter tetapi di kelas Endpoint, nama adalah NULL
.
Kemudian saya menemukan bahwa getEntityStream yang dikembalikan dari requestContext adalah Jetty custom ServletInputStream
yaitu org.eclipse.jetty.server.HttpInput
. Saya yakin permintaan tersebut tidak dapat dibaca di EndPoint karena saya mengatur Aliran Entitas menggunakan ByteArrayInputStream.
Jadi pertanyaan saya adalah, apakah ada cara untuk membangun/mengonversi Jetty HttpInput menggunakan implementasi InputStream generik? atau ada cara lain untuk menyiasati kasus ini? di mana saya bisa membaca Jetty HttpInput berkali-kali?
Terima kasih & Salam