2016-04-26 122 views
0

我们目前在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; 
    } 
+0

你能发布你已经试图添加拦截器吗? – Frank

+0

以这种方式编辑,所以您确认Interceptor是我们需求的良策? – Sid

+0

看起来很对。我会扩展AbstractPhaseInterceptor而不是LoggingOutInterceptor,但这不是必需的。你怎么知道你的拦截器没有被调用?您是否在'SoapMessage soapMessage = message.getContent(SoapMessage.class);'?中设置了断点?如果你喜欢处理一个错误,你应该有'Fault fault =(Fault)message.getContent(Exception.class);'而不是在发生错误的情况下得到SoapMessage为null。 – 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为空。所以你不会在你的日志中得到任何输出。