Apache CXF の場合、CXF 実装固有の Interceptor を使用するのが最善の方法です。以下は、カスタム インターセプタ クラスの例です。
package com.company.app.interceptor;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.w3c.dom.Element;
public class SOAPHeaderInterceptor extends AbstractSoapInterceptor {
private static Logger logger = Logger.getLogger(SOAPHeaderInterceptor.class);
public SOAPHeaderInterceptor() {
super(Phase.USER_PROTOCOL);
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
try {
Header fromHeader = message.getHeader(new QName("http://www.w3.org/2005/08/addressing", "From"));
Header messageIdHeader = message.getHeader(new QName("http://www.w3.org/2005/08/addressing", "MessageID"));
String from = null;
if (fromHeader != null && fromHeader.getObject() != null) {
from = ((Element)fromHeader.getObject()).getTextContent();
}
String messageId = null;
if (messageIdHeader != null && messageIdHeader.getObject() != null) {
messageId = ((Element)messageIdHeader.getObject()).getTextContent();
}
} catch (Exception e) {
logger.error("Unable to read SOAP Headers", e);
}
}
}
次に、JAX-WS サービス実装クラスで @InInterceptors アノテーションを指定します。
@InInterceptors(interceptors ="com.company.app.interceptor.SOAPHeaderInterceptor")