2017-04-05 5 views
0

仕様を満たしていないFaultを生成しているサーバーに対してSOAPクライアントを作成しています。具体的には、障害理由(spec)のText要素にlang属性がありません。私はSpring WS 2.4.0を使用しています。 SaajSoapMessageに解析される前に、レスポンスを傍受して属性を挿入する方法はありますか?私はClientInterceptorを作成しようとしましたが、xmlはインターセプタにヒットした時点ですでに解析されています。私自身のMessageFactoryを作成する必要がありますか?不正な形式のSOAPエラーを処理します。

答えて

1

私はthis answerthis answerの助けを借りてこれを解決しました。これは単にソースXMLを受け取り、XSL変換を介してそれを実行

@Override 
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException { 
    LOGGER.debug("intercepted a fault."); 
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    WebServiceMessage response = messageContext.getResponse(); 
    Source source = response.getPayloadSource(); 
    StreamResult streamResult = new StreamResult(new StringWriter()); 

    try { 
     Transformer displayTransformer = transformerFactory.newTransformer(); 
     displayTransformer.transform(source, streamResult); 
     LOGGER.debug("\t>> initial response\n" + streamResult.getWriter().toString()); 

     StreamSource xslSource = new StreamSource(new File(
       FaultInterceptor.class.getResource("/SoapFaultFix.xsl").getFile() 
     )); 
     Transformer modifyingTransformer = transformerFactory.newTransformer(xslSource); 
     modifyingTransformer.transform(source, response.getPayloadResult()); 

    } catch (TransformerException e) { 
     e.printStackTrace(); 
    } 

    return true; 
} 

:私は私のWebServiceGatewaySupportをインスタンス化するとき

は、私はhandleFault()方法を構成ClientInterceptorを追加しました。コンテンツを失わないように、identity transformationで始まることが重要です。その後、属性と値を追加して、既存の値にドロップしました。私SoapFaultFix.xslはこのように見えた:私はDOMに掘削見つけたので、私はこのアプローチを気に入っ

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" 
> 
    <xsl:template match="/ | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="//soapenv:Fault/soapenv:Reason/soapenv:Text"> 
     <soapenv:Text> 
      <xsl:attribute name="xml:lang">en</xsl:attribute> 
      <xsl:value-of select="."/> 
     </soapenv:Text> 
    </xsl:template> 
</xsl:stylesheet> 

、純粋なJavaの持つ困難だった、と私は簡単に他の変更を行うことがXSLを拡張することができます。

関連する問題