我们目前在Jboss EAP 6.2上使用CXF 2.7.3时遇到了自定义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>
子代码完全丢失。
我们试图使用自定义拦截器从CXF像这样(从LoggingOutInterceptor或AbstractInterceptor延伸)拦截定制故障:
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
的肥皂断层落差后不叫在我们的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);'?中设置了断点?如果你喜欢处理一个错误,你应该有'Fault fault =(Fault)message.getContent(Exception.class);'而不是在发生错误的情况下得到SoapMessage为null。 – Frank