CXF,out interceptor,改变响应SOAP体

时间:2015-03-20 10:13:16

标签: java soap cxf interceptor

使用CXF拦截器,我想改变作为响应发送给客户端的响应主体。 (我想添加更多节点) 我的拦截器被配置为一个外向拦截器,正在被调用,但是主体是空的。

public class AlterOutBodyInterceptor extends AbstractSoapInterceptor {
    private SAAJOutInterceptor saajOut = new SAAJOutInterceptor();

    public AlterOutBodyInterceptor() {
        super(Phase.PRE_MARSHAL);
        getBefore().add(SAAJOutInterceptor.class.getName());
    }

    public void handleMessage(SoapMessage message) throws Fault {
        SOAPMessage doc = message.getContent(SOAPMessage.class);
        if (doc == null) {
            saajOut.handleMessage(message);
            doc = message.getContent(SOAPMessage.class);
            // it is executed
        }

        try {
            SOAPBody body = doc.getSOAPBody();
            // here, body doesn't contain anything that the client gets
        } catch (SOAPException e) {
            e.printStackTrace();
        }
    }
}

我正在使用getBefore - getAfter和Phases进行试错,但没有运气。提前谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案如下: (我们检查了cxf源,因为它包含很多拦截器,我们从那里得到了想法)

public class Interceptor extends AbstractPhaseInterceptor<Message> {
    private ObjectFactory objectFactory = new ObjectFactory();

    public Interceptor() {
        super(Phase.PRE_LOGICAL);
        addBefore(HolderOutInterceptor.class.getName());
    }

    @Override
    public void handleMessage(Message message) {
        MessageContentsList outObjects = MessageContentsList.getContentsList(message);
        Assert.isTrue(outObjects.size() == 1);
        Object outObject = outObjects.get(0);
        // object is our soap response
    }
}