ขณะนี้ฉันกำลังพัฒนา REST API โดยใช้ RestEasy
และ Jetty
หนึ่งในแผนของฉันกับ REST API นี้คือการสร้างปลั๊กอิน hook เพื่อทำทุกอย่างที่จำเป็นกับคำขอขาเข้าโดยใช้ JAX-RS ContainerRequestFilter
สิ่งที่มี ContainerRequestPlugin
ใน Jetty
คือเมื่อฉันเรียก requestContext.getEntityStream();
ในตัวกรองแล้ว EndPoint Class ของฉันจะไม่สามารถอ่านคำขอได้อีกครั้งแม้ว่าฉันจะตั้งค่า 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 คือ Jetty custom ServletInputStream
นั่นคือ org.eclipse.jetty.server.HttpInput
ฉันเชื่อว่าไม่สามารถอ่านคำขอใน EndPoint ได้เนื่องจากฉันตั้งค่า Entity Stream โดยใช้ ByteArrayInputStream
ดังนั้นคำถามของฉันคือ มีวิธีใดที่จะสร้าง/แปลง Jetty HttpInput โดยใช้การใช้งาน InputStream ทั่วไปหรือไม่ หรือมีวิธีอื่นใดในการแก้ไขกรณีนี้หรือไม่? ฉันจะอ่าน Jetty HttpInput ได้หลายครั้งที่ไหน
ขอขอบคุณและขอแสดงความนับถือ