В настоящее время у нас есть проблема с 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;
}
Не могли бы вы опубликовать то, что вы уже пытались добавить перехватчик? – Frank
Отредактировано таким образом, поэтому вы подтверждаете, что Interceptor - хорошая стратегия для наших нужд? – Sid
Выглядит неплохо. Я бы расширил AbstractPhaseInterceptor вместо LoggingOutInterceptor, но это не обязательно. Откуда вы знаете, что ваш перехватчик не называется? Вы установили точку останова в 'SoapMessage soapMessage = message.getContent (SoapMessage.class);'? Если вам нравится обрабатывать ошибку, вы должны иметь «Ошибка ошибки = (ошибка) message.getContent (Exception.class);» вместо получения SoapMessage, которая является нулевой, если возникла ошибка. – Frank