2016-04-26 9 views
0

現在、Jboss EAP 6.2のCXF 2.7.3で、カスタムSoapFault例外が発生しています。CXF webservice:interceptor not triggered

我々はカスタムにSoapFault送信するときにサブコードとその値が表示されていない。ここで

たちはCXFから欲しいものである:ここでは

<?xml version="1.0" encoding="UTF-8"?> 
<tns:Fault 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tns="http://www.w3.org/2003/05/soap-envelope"> 
    <tns:Code> 
     <tns:Value>tns:Sender</tns:Value> 
     <tns:Subcode> 
      <tns:Value>value</tns:Value> 
     </tns:Subcode> 
    </tns:Code> 
    <tns:Reason> 
     <tns:Text xml:lang="fr"> 
**** 
     </tns:Text> 
    </tns:Reason> 
    <tns:Detail> 
**Custom fault*** 
    </tns:Detail> 
</tns:Fault> 

は、我々がこれまで持っているものです。

<?xml version="1.0" encoding="UTF-8"?> 
<tns:Fault 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tns="http://www.w3.org/2003/05/soap-envelope"> 
    <tns:Code> 
     <tns:Value>tns:Sender</tns:Value> 
    </tns:Code> 
    <tns:Reason> 
     <tns:Text xml:lang="fr"> 
**** 
     </tns:Text> 
    </tns:Reason> 
    <tns:Detail> 
**Custom fault*** 
    </tns:Detail> 
</tns:Fault> 

サブコードが完全にありません。

私たちは、カスタム・フォールトを傍受するために、このようにCXFから(LoggingOutInterceptorまたはAbstractInterceptorから延びる)カスタムインターセプタを使用しようとした:我々はCXFバスに彼のどちらかを追加するときにインターセプタがさえ呼ばれていない

public class SoapRequestInterceptor extends LoggingOutInterceptor { 

     private static Logger log = Logger.getLogger(SoapRequestInterceptor.class); 

    public SoapRequestInterceptor() { 
     super(Phase.MARSHAL); 

    } 

     public void handleMessage(SoapMessage message) throws Fault{ 
       SoapMessage soapMessage = message.getContent(SoapMessage.class); 

       if (soapMessage != null) { 
        log.info("request intercepted:" + soapMessage.toString()); 
       } 

     } 

} 

かjaxwsインターセプタ(これはコンストラクタを通過するため、アプリケーションの開始時に追加されます)。 CXFでカスタムSOAPメッセージを傍受して編集するにはどうすればよいですか?

ありがとうございます!

ここに尋ねたが、私たちは春のapplicationContext.xmlをでインターセプタを宣言する方法ですとおり:

<cxf:bus> 
     <cxf:outFaultInterceptors> 
      <ref bean="soapRequestInterceptor" /> 
     </cxf:outFaultInterceptors> 
    </cxf:bus> 

    <bean id="soapRequestInterceptor" class="fr.test.SoapRequestInterceptor" /> 

    <jaxws:server serviceClass="fr.test.PriseEnChargeB2ServiceSP" 
     address="" serviceBean="#service"> 
     <jaxws:binding> 
      <soap:soapBinding version="1.2" mtomEnabled="true" /> 
     </jaxws:binding> 
    </jaxws:server> 

注:インターセプタが良くinstanciedですが、私たちのWS

からSOAP障害スロー後に呼び出されていません私たちのWSの最後にスローされた例外はこの1つである:

public class PecSoapFaultException extends SoapFault { 

    private static final long serialVersionUID = 1L; 

    public TypeErreur erreur; 

    public PecSoapFaultException(String message, TypeErreur structure) { 
     super(message, new QName("")); 
     this.erreur = structure; 
    } 

    public PecSoapFaultException(String message, TypeErreur structure, QName faultcode) { 
     super(message, faultcode); 
     this.erreur = structure; 
    } 

    public PecSoapFaultException(String message, TypeErreur structure, QName faultcode, 
      QName subcode) { 
     super(message, faultcode); 

     this.setSubCode(subcode); 
     this.erreur = structure; 
    } 

    public TypeErreur getFaultInfo() { 
     return erreur; 
    } 
+0

すでにインターセプタを追加しようとしましたが投稿できますか? – Frank

+0

このように編集されたので、Interceptorが私たちのニーズに適した戦略であることを確認しましたか? – Sid

+0

かなり見える。 LoggingOutInterceptorではなくAbstractPhaseInterceptorを拡張しますが、これは必須ではありません。インターセプタが呼び出されていないことをどのように知っていますか?あなたは 'SoapMessage soapMessage = message.getContent(SoapMessage.class);でブレークポイントを設定しましたか?フォールトを処理したい場合は、フォルトが発生した場合にnullであるSoapMessageを取得する代わりに、 'Fault fault =(Fault)message.getContent(Exception.class);'が必要です。 – Frank

答えて

0

あなたのインターセプタが呼び出されていない問題は、あなたが正しいメトをオーバーライドしていないということですd。

@Override 
    public void handleMessage(Message message) throws Fault { 
     SoapMessage soapMessage = message.getContent(SoapMessage.class); 

     if (soapMessage != null) { 
      log.info("request intercepted:" + soapMessage.toString()); 
     } 

    } 

次に、インターセプタが呼び出されます。しかし、私のコメントで言ったように:失敗の場合、soapmessageはnullです。だからあなたはあなたのログに出力を得ることはありません。