cxf当服务器返回错误500时INOUT

时间:2014-03-13 11:36:00

标签: java spring soap cxf webservice-client

我有一个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
    );

1 个答案:

答案 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;
                    }
                }
            }
        }
    }
}