18.7. 如何让 camel-cxf 响应以 xml 处理指令开头
如果您使用一些 SOAP 客户端,如 PHP,则会出现这类错误,因为 CXF 没有添加 XML 处理指令 < ?xml version="1.0" encoding="utf-8"?>:
Error:sendSms: SoapFault exception: [Client] looks like we got no XML document in [...]
要解决这个问题,您只需要告知 StaxOutInterceptor 为您 编写 XML 启动文档,如下所示:
public class WriteXmlDeclarationInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public WriteXmlDeclarationInterceptor() {
super(Phase.PRE_STREAM);
addBefore(StaxOutInterceptor.class.getName());
}
public void handleMessage(SoapMessage message) throws Fault {
message.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
}
}
另外,您还可以为它添加一个消息标头,如 CxfConsumerTest 所示:
// set up the response context which force start document
Map<String, Object> map = new HashMap<String, Object>();
map.put("org.apache.cxf.stax.force-start-document", Boolean.TRUE);
exchange.getOut().setHeader(Client.RESPONSE_CONTEXT, map);