实际上有一个 JAX-WS RI(又名 Metro)特定的解决方案,它非常有效。
请参阅https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-ri。不幸的是,该链接现在已损坏,但您可以在 WayBack Machine 上找到它。我将在下面给出重点:
早在 2007 年,Metro 就引入了一种额外的处理程序类型MessageHandler<MessageHandlerContext>
,它是 Metro 专有的。SOAPHandler<SOAPMessageContext>
它比不尝试在内存中进行 DOM 表示要高效得多。
这是原始博客文章中的关键文本:
消息处理程序:
利用 JAX-WS 规范提供的可扩展处理程序框架和 RI 中更好的消息抽象,我们引入了一个新的处理程序,称为MessageHandler
扩展您的 Web 服务应用程序。MessageHandler 类似于 SOAPHandler,除了它的实现可以访问MessageHandlerContext
(MessageContext 的扩展)。通过 MessageHandlerContext 可以访问 Message 并使用 Message API 处理它。正如我在博客标题中提到的,这个处理程序允许您处理消息,它提供了访问/处理消息的有效方法,而不仅仅是基于 DOM 的消息。处理程序的编程模型是相同的,消息处理程序可以与标准逻辑和 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 年博文)
您可以在Metro GitHub 存储库中找到完整示例。