2011-06-22 12 views
5

私はテスト用のインターセプタを作成します。しかし、私は、インターセプタのSoapメッセージ本文が常にnullです。CXF発信インターセプタは、常にヌルである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

は私を与えることができますいくつかの提案?ありがとう! – user809965

+0

SOAPコンテンツをStringまたはオブジェクトとして探していますか? – ThomasRS

答えて

2

メッセージがある位相に依存この瞬間にフェーズのリストは Interceptor dokuにあります。メッセージの内容を取得しようとすると、メッセージが存在する形式を見つける必要があります。 getContentFormatsをご覧ください。いくつかのオブジェクトはメッセージを表示しません。最も時間がかかるのはCXFです。したがって、ストリームオブジェクトをフラッシュできます。

最高に関しては

クリスチャン

2

あなたintercepterは)(SAAJOutInterceptor後に実行する必要があります。 たとえば、Glen Mazza's Weblog

9

soapメッセージから応答xmlを取得するには、 "CacheAndWriteOutputStream"と "CachedOutputStreamCallback"を使用できます。コールバッククラスでは、ストリームを閉じる前にメッセージを取得できます。ここで、我々はまた、CXFのjarファイルで利用できるいくつかのデフォルトインターセプタを持っている、ということ

<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> 

注:言う、私たちのうちLoggingInterceptorは、次のようにコンテキストファイルで設定することができ、「wsLoggingOutInterceptor」です。私たちは、出力応答メッセージをログに記録するか、あなたもここに編集することができ、次のように書くことができます私たち自身のインターセプタで今 :

/** 
* @author asraf 
* [email protected] 
*/ 
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

関連する問題