CXF传出Interceptor得到的SOAP响应体总是为null?

时间:2011-06-22 10:10:07

标签: soap cxf response interceptor

我写了一个拦截器进行测试。但是我在拦截器中得到Soap消息体总是为空。

我的Cxf是Apache-CXF-2.4.0

bean.xml是这样的:

<cxf:bus>
    <cxf:outInterceptors>
        <ref bean="myOutSoapInterceptor"/>
  </cxf:outInterceptors>
</cxf:bus>

拦截器文件:

public class MySoapInterceptorImpl extends AbstractSoapInterceptor implements IMySoapInterceptor {

public MySoapInterceptorImpl()
{
    super(Phase.WRITE );
    addAfter(SoapOutInterceptor.class.getName());
}


public void handleMessage(SoapMessage msg) throws Fault {
    // TODO Auto-generated method stub
    String soapContent ;
    SOAPMessage sm = msg.getContent(SOAPMessage.class);

    /*sm is always null!*/
    }
 }

3 个答案:

答案 0 :(得分:9)

要从soap消息中获取响应xml,可以使用“CacheAndWriteOutputStream”和“CachedOutputStreamCallback”。在回调类中,您可以在关闭流之前获取消息。比如说,我们的LoggingInterceptor是“wsLoggingOutInterceptor”,它可以在上下文文件中配置如下:

<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
<bean id="logOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<bean id="wsLoggingOutInterceptor" class="org.jinouts.webservice.logging.WSLoggingOutInterceptor"></bean>

   <cxf:bus>
        <cxf:inInterceptors>
            <ref bean="loggingInInterceptor"/>           
        </cxf:inInterceptors>
        <cxf:outInterceptors>
            <ref bean="logOutInterceptor"/>
            <ref bean="wsLoggingOutInterceptor"/>
       </cxf:outInterceptors>
    </cxf:bus>

请注意,这里我们还有一些可用于CXF jar的默认拦截器。 现在在我们自己的拦截器中,我们可以用以下方式编写日志输出响应消息,或者你也可以在这里编辑:

/**
 * @author asraf
 * asraf344@gmail.com
 */
public class WSLoggingOutInterceptor extends AbstractLoggingInterceptor
{
    public WSLoggingOutInterceptor() 
    {
        super(Phase.PRE_STREAM );
    }

    @Override
    public void handleMessage ( Message message ) throws Fault
    {
        // TODO Auto-generated method stub
        OutputStream os = message.getContent ( OutputStream.class );
        CacheAndWriteOutputStream cwos = new CacheAndWriteOutputStream ( os);
        message.setContent ( OutputStream.class, cwos );

        cwos.registerCallback ( new LoggingOutCallBack ( ) );
    }

    @Override
    protected Logger getLogger ( )
    {
        // TODO Auto-generated method stub
        return null;
    }
}
class LoggingOutCallBack implements CachedOutputStreamCallback
{
    @Override
    public void onClose ( CachedOutputStream cos )
    {
        try
        {
            if ( cos != null )
            {
                System.out.println ("Response XML in out Interceptor : " + IOUtils.toString ( cos.getInputStream ( ) ));
            }

        }
        catch ( Exception e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }

    @Override
    public void onFlush ( CachedOutputStream arg0 )
    {

    }   
}

有关详细信息,请访问此网站:http://cxf.apache.org/docs/interceptors.html

答案 1 :(得分:3)

此消息取决于您此时的阶段。您可以找到包含阶段的列表 Interceptor doku。如果您尝试获取消息内容,则需要找到消息所在的格式。看看getContentFormats。有些对象不会给你留言。 CXF使用流的最多时间。因此可以刷新流对象。

致以最诚挚的问候 基督教

答案 2 :(得分:2)

你的截取者必须在SAAJOutInterceptor()之后运行; 例如Glen Mazza's Weblog