The solution found here , but it does not work.
Come up with this solution that works for me: create an interceptor that checks the MessageID header and adds it to the message if it does not exist:
package my.package;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.headers.Header;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class HeaderInterceptor extends AbstractPhaseInterceptor<Message> {
private static final String SOAP_HEADER_KEY = "org.apache.cxf.headers.Header.list";
private static final String NAMESPACE_URI = "http://www.w3.org/2005/08/addressing";
private static final String QUALIFIED_NAME = "wsa:MessageID";
private static final String LOCAL_NAME = "MessageID";
public HeaderInterceptor() {
super(Phase.PRE_PROTOCOL);
}
@Override
public void handleMessage(Message message) throws Fault {
ArrayList<SoapHeader> headers = (ArrayList<SoapHeader>) message.get(SOAP_HEADER_KEY);
if(!messageIdHeaderExists(headers) && headers.size() > 0) {
Element existingHeaderElement = (Element) headers.get(0).getObject();
Element element = existingHeaderElement.getOwnerDocument().createElementNS(NAMESPACE_URI, QUALIFIED_NAME);
element.appendChild(existingHeaderElement.getOwnerDocument().createTextNode("uuid:" + UUID.randomUUID().toString()));
QName qname = new QName(NAMESPACE_URI, LOCAL_NAME);
SoapHeader header = new SoapHeader(qname, element);
header.setDirection(Header.Direction.DIRECTION_IN);
headers.add(header);
}
}
private Boolean messageIdHeaderExists(ArrayList<SoapHeader> headers) {
for(SoapHeader header:headers) {
if(header.getName().getLocalPart().equalsIgnoreCase(LOCAL_NAME)) {
return true;
}
}
return false;
}
}
Define an interceptor in the context of Spring:
<bean id="headerInterceptor" class="my.package.HeaderInterceptor" />
<jaxws:endpoint implementor="#service" address="/ws">
<jaxws:inInterceptors>
<ref bean="headerInterceptor" />
</jaxws:inInterceptors>
</jaxws:endpoint>
CXF 2.6.1.
: http://cxf.apache.org/docs/interceptors.html