คำตอบที่แสดงไว้ที่นี่ซึ่งแนะนำให้คุณใช้SOAPHandler
นั้นถูกต้องครบถ้วน ประโยชน์ของวิธีการนั้นคือมันจะทำงานกับการติดตั้ง JAX-WS ใด ๆ เนื่องจาก SOAPHandler เป็นส่วนหนึ่งของข้อกำหนด JAX-WS อย่างไรก็ตามปัญหาของ SOAPHandler คือความพยายามที่จะแสดงข้อความ XML ทั้งหมดในหน่วยความจำโดยปริยาย สิ่งนี้สามารถนำไปสู่การใช้งานหน่วยความจำขนาดใหญ่ การติดตั้งใช้งานที่หลากหลายของ JAX-WS ได้เพิ่มวิธีแก้ไขปัญหาของตนเองสำหรับสิ่งนี้ หากคุณทำงานกับคำขอขนาดใหญ่หรือการตอบกลับที่มีขนาดใหญ่คุณจำเป็นต้องพิจารณาแนวทางที่เป็นกรรมสิทธิ์
เนื่องจากคุณถามถึง "สิ่งที่รวมอยู่ใน JDK 1.5 หรือดีกว่า" ฉันจะตอบด้วยความเคารพอย่างเป็นทางการว่า JAX-WS RI (aka Metro) ซึ่งเป็นสิ่งที่รวมอยู่ใน JDK
JAX-WS RI มีวิธีแก้ปัญหาเฉพาะสำหรับเรื่องนี้ซึ่งมีประสิทธิภาพมากในแง่ของการใช้หน่วยความจำ
ดูhttps://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri น่าเสียดายที่ตอนนี้ลิงค์เสีย แต่คุณสามารถหาได้จาก WayBack Machine ฉันจะให้ไฮไลท์ด้านล่าง:
กลุ่มคนเมโทรในปี 2550 ได้เปิดตัวอุปกรณ์จัดการเพิ่มเติมMessageHandler<MessageHandlerContext>
ซึ่งเป็นกรรมสิทธิ์ของเมโทร มันมีประสิทธิภาพมากกว่าSOAPHandler<SOAPMessageContext>
ที่ไม่ได้พยายามทำการแทน DOM ในหน่วยความจำ
นี่คือข้อความสำคัญจากบทความบล็อกต้นฉบับ:
MessageHandler:
การใช้เฟรมเวิร์ก Handler แบบขยายได้ที่จัดทำโดยข้อกำหนด JAX-WS และการลบข้อความที่ดีขึ้นใน RI เราแนะนำตัวจัดการใหม่ที่เรียกว่าMessageHandler
เพื่อขยายแอปพลิเคชันบริการเว็บของคุณ MessageHandler คล้ายกับ SOAPHandler ยกเว้นว่าการใช้งานของมันจะเข้าถึงMessageHandlerContext
(ส่วนขยายของ MessageContext) ผ่าน MessageHandlerContext เราสามารถเข้าถึง Message และประมวลผลโดยใช้ Message API เมื่อฉันใส่ชื่อของบล็อกตัวจัดการนี้ให้คุณทำงานกับ Message ซึ่งให้วิธีที่มีประสิทธิภาพในการเข้าถึง / ประมวลผลข้อความไม่ใช่แค่ข้อความจาก DOM โมเดลการเขียนโปรแกรมของตัวจัดการเหมือนกันและตัวจัดการข้อความสามารถผสมกับตัวจัดการ Logical และ SOAP มาตรฐาน ฉันได้เพิ่มตัวอย่างใน JAX-WS RI 2.1.3 แสดงการใช้ MessageHandler เพื่อบันทึกข้อความและนี่คือตัวอย่างจากตัวอย่าง:
public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}
public void close(MessageContext messageContext) { }
public Set getHeaders() {
return null;
}
}
(อ้างอิงท้ายจากบล็อกโพสต์ 2007)
ในตัวอย่างที่จำเป็นต้องพูดถึงตัวจัดการแบบกำหนดเองของคุณLoggingHandler
จำเป็นต้องเพิ่มลงในห่วงโซ่จัดการของคุณเพื่อให้มีผลกระทบใด ๆ นี่เหมือนกับการเพิ่มคำอื่น ๆHandler
ดังนั้นคุณสามารถดูคำตอบอื่น ๆในหน้านี้เพื่อดูวิธีการทำ
คุณสามารถหาตัวอย่างเต็มรูปแบบในrepo เมโทร GitHub