我写了一个拦截器进行测试。但是我在拦截器中得到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!*/
}
}
答案 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