2016-04-26 3 views
0

В настоящее время у нас есть проблема с CXF 2.7.3 на Jboss EAP 6.2 с помощью специального исключения SoapFault.CXF webservice: перехватчик не запускается

Субкод и его значение не отображается, когда мы посылаем пользовательский 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> 

Подкод полностью отсутствует.

Мы пытались использовать собственный перехватчик (простирающийся от 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()); 
       } 

     } 

} 

перехватчик даже не вызывается, когда мы добавим его либо к шине CXF или для перехватчика jaxws (он добавляется в начале приложения, хотя, поскольку он проходит через конструктор). Как мы можем перехватить пользовательское сообщение о неисправности мыла и отредактировать его в CXF?

Большое спасибо!

Как спросили здесь, как мы объявляем перехватчик в весенний 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

The исключение, в конце нашего WS это одна:

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

Выглядит неплохо. Я бы расширил AbstractPhaseInterceptor вместо LoggingOutInterceptor, но это не обязательно. Откуда вы знаете, что ваш перехватчик не называется? Вы установили точку останова в 'SoapMessage soapMessage = message.getContent (SoapMessage.class);'? Если вам нравится обрабатывать ошибку, вы должны иметь «Ошибка ошибки = (ошибка) message.getContent (Exception.class);» вместо получения SoapMessage, которая является нулевой, если возникла ошибка. – Frank

ответ

0

проблема, что ваш перехватчик не вызывается в том, что вы не отменяют правильный мето д. У вас должен быть код:

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

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

    } 

Тогда ваш перехватчик будет называться. Но, как я сказал в своем комментарии: в случае неисправности мыльная ошибка равна нулю. Таким образом, вы не получите какой-либо результат в своем журнале.