Các câu trả lời được liệt kê ở đây hướng dẫn bạn sử dụng SOAPHandler
là hoàn toàn chính xác. Lợi ích của cách tiếp cận đó là nó sẽ hoạt động với bất kỳ triển khai JAX-WS nào, vì SOAPHandler là một phần của đặc tả JAX-WS. Tuy nhiên, vấn đề với SOAPHandler là nó cố gắng thể hiện toàn bộ thông điệp XML trong bộ nhớ. Điều này có thể dẫn đến việc sử dụng bộ nhớ lớn. Các triển khai khác nhau của JAX-WS đã thêm cách giải quyết của riêng họ cho việc này. Nếu bạn làm việc với các yêu cầu lớn hoặc phản hồi lớn, thì bạn cần xem xét một trong những cách tiếp cận độc quyền.
Vì bạn hỏi về "cái được bao gồm trong JDK 1.5 trở lên", tôi sẽ trả lời liên quan đến cái được gọi là JAX-WS RI (hay còn gọi là Metro) chính thức, cái được bao gồm trong JDK.
JAX-WS RI có một giải pháp cụ thể cho việc này rất hiệu quả về mặt sử dụng bộ nhớ.
Xem https://javaee.github.io/metro/doc/user-guide/ch02.html#ffic-handlers-in-jax-ws-ri . Thật không may, liên kết đó hiện đã bị hỏng nhưng bạn có thể tìm thấy nó trên WayBack Machine. Tôi sẽ đưa ra những điểm nổi bật dưới đây:
Người dân Metro trở lại vào năm 2007 đã giới thiệu một loại xử lý bổ sung MessageHandler<MessageHandlerContext>
, thuộc sở hữu của Metro. Nó hiệu quả hơn nhiều so SOAPHandler<SOAPMessageContext>
với việc nó không cố gắng thực hiện biểu diễn DOM trong bộ nhớ.
Đây là văn bản quan trọng từ bài viết blog gốc:
MessageHandler:
Sử dụng khung Trình xử lý mở rộng được cung cấp bởi Đặc tả JAX-WS và tính trừu tượng hóa Thông báo tốt hơn trong RI, chúng tôi đã giới thiệu một trình xử lý mới được gọi MessageHandler
để mở rộng các ứng dụng Dịch vụ web của bạn. MessageHandler tương tự như SOAPHandler, ngoại trừ việc triển khai nó được truy cập vàoMessageHandlerContext
(một phần mở rộng của MessageContext). Thông qua MessageHandlerContext, người ta có thể truy cập Tin nhắn và xử lý nó bằng API Tin nhắn. Khi tôi đặt tiêu đề của blog, trình xử lý này cho phép bạn làm việc trên Tin nhắn, cung cấp các cách hiệu quả để truy cập / xử lý thư không chỉ là tin nhắn dựa trên DOM. Mô hình lập trình của các trình xử lý là giống nhau và các trình xử lý Message có thể được trộn lẫn với các trình xử lý Logical và SOAP tiêu chuẩn. Tôi đã thêm một mẫu trong JAX-WS RI 2.1.3 cho thấy việc sử dụng MessageHandler để ghi nhật ký tin nhắn và đây là đoạn trích từ mẫu:
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;
}
}
(trích dẫn từ bài viết trên blog năm 2007)
Không cần phải nói Handler tùy chỉnh của bạn, LoggingHandler
trong ví dụ, cần phải được thêm vào Chuỗi Handler của bạn để có bất kỳ ảnh hưởng nào. Điều này giống như thêm bất kỳ câu hỏi nào khác Handler
, vì vậy bạn có thể xem các câu trả lời khác trên trang này để biết cách thực hiện.
Bạn có thể tìm thấy một ví dụ đầy đủ trong repo Metro GitHub .