我有一个spring配置的cxf soap客户端,它使用soap头来维护服务器端的增量sessionId。 当服务器返回http 500错误时,它还包含包含会话下一个值的soap标头。我无法读取此值,因为方法调用会抛出 SoapException 并且不会填充 sessionId Holder 对象。我想我可以使用故障拦截器但是 我想知道它是否可以更清洁。非常感谢任何帮助。
public profileCreateUpdateProfile(
@WebParam(partName = "Profile_CreateUpdateProfile_1_2", name = "Profile_CreateUpdateProfile")
ProfileCreateUpdateProfile profileCreateUpdateProfile12,
@WebParam(partName = "SessionId", mode = WebParam.Mode.INOUT, name = "SessionId", header = true)
javax.xml.ws.Holder<java.lang.String> sessionId
);
答案 0 :(得分:0)
我使用了一个扩展org.apache.cxf.phase.AbstractPhaseInterceptor的iterceptor。实现类在soapheader上迭代以获取sessionId值并保存它
public class SessionFaultInterceptor extends AbstractPhaseInterceptor<Message> {
public SessionFaultInterceptor() {
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message) throws Fault {
Message in = message.getExchange().getInFaultMessage();
if(in != null){
List<SoapHeader> headers = (List<SoapHeader>) in.get(Header.HEADER_LIST);
for(SoapHeader header:headers){
if(header.getObject() instanceof Element){
Element headerElement = (Element)header.getObject();
if("SessionId".equalsIgnoreCase(headerElement.getNodeName())){
if(log.isDebugEnabled()){
log.debug("Update"+headerElement.getNodeName()+" with value "+headerElement.getTextContent());
}
break;
}
}
}
}
}
}