SOAP Message Validation ポリシーのランタイム エラーのトラブルシューティング

Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメント
詳細

SourceMessageNotAvailable

エラーコード

steps.messagevalidation.SourceMessageNotAvailable

エラー レスポンスの本文

{
  "fault": {
    "faultstring": "source_var_name message is not
     available for[policy_name]",
    "detail": {
      "Errorcode":
       "steps.messagevalidation.SourceMessageNotAvailable"
     }
  }
}

エラー レスポンスの本文の例

{
  "fault": {
    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
    "detail": {
      "errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
    }
  }
}

原因

このエラーは、SOAPMessageValidation ポリシーの <Source> 要素で指定された message 変数が、次のいずれかである場合に発生します。

  • 範囲外(ポリシーが実行されている特定のフローで使用できない)
  • 解決できない(定義されていない)

たとえば、SOAPMessageValidation ポリシーの <Source> 要素が、ポリシーが実行されるフローに存在しない変数に設定されている場合に、このエラーが発生します。

診断

  1. エラーが発生した SOAPMessageValidation ポリシーの名前と source 変数の名前を障害文字列から特定します。たとえば、次の障害文字列では、SOAPMessageValidation ポリシーの名前は SOAP-Message-Validation-1source 変数は request です。

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. 失敗した SOAPMessageValidation ポリシーの XML で、<Source> 要素に設定された変数名が、障害文字列内で特定された変数名(上記のステップ 1)に一致していることを確認します。

    たとえば、次の SOAPMessageValidation ポリシーでは、<Source> 要素内の request という名前の変数を指定しています、これは、障害文字列の内容と一致します。

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. <Source> 要素で使用される変数が定義されていて、SOAPMessageValidation ポリシーが実行されるフローで使用できることを確認します。

    変数が次のいずれかの状態になっていないか確認します。

    • 範囲外(ポリシーが実行されている特定のフローで使用できない)
    • 解決できない(定義されていない)

    該当する場合は、それがエラーの原因です。

    例として、上記の SOAPMessageValidation ポリシーがレスポンス フローで実行されるとします。ただし、上記の <Source> 要素の例で使用されている request 変数は、リクエスト フローでのみ使用できます。

    request 変数はレスポンス フローに存在しないため、次のエラーを受け取ります。

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    

解決策

失敗した SOAPMessageValidation ポリシーの <Source> 要素内に設定された変数が定義されていて、ポリシーが実行されるフローに存在することを確認します。

上記の例を修正するには、レスポンス フローにある response 変数を使用するように <Source> 要素を変更します。

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
    <SOAPMessage/>
    <Source>response</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

NonMessageVariable

エラーコード

steps.messagevalidation.NonMessageVariable

エラー レスポンスの本文

{
  "fault": {
    "faultstring": "Variable var_name does not resolve to a Message"
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

エラー レスポンスの本文の例

{
  "fault": {
    "faultstring": "Variable message.content does not resolve to a Message",
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

原因

このエラーは、SOAPMessageValidation ポリシーの <Source> 要素が Message 型以外の変数に設定されている場合に発生します。

Message 型の変数は、HTTP リクエストとレスポンス全体を表します。組み込みの Apigee Edge フロー変数 requestresponsemessage はメッセージ型です。メッセージ変数の詳細については、変数リファレンスをご覧ください。

診断

  1. 障害文字列からメッセージ型に解決されない変数の名前を特定します。たとえば、次の障害文字列の変数の名前は message.content です。

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. エラーが発生した特定の API プロキシで、すべての SOAPMessageValidation ポリシーを調べます。SOAPMessageValidation ポリシーは複数ある場合があります。<Source> 要素で指定された変数が障害文字列で特定された変数名(上記のステップ 1)と一致している、特定の SOAPMessageValidation ポリシーを特定します。

    たとえば、次のポリシーにより、<Source> 要素が message.content という名前の変数に設定されます。これは、障害文字列の内容と一致します。

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>message.content</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    

    変数 message.content は Message 型ではないため、次のエラーが発生します。

    "faultstring": "Variable message.content does not resolve to a Message"
    

解決策

失敗した SOAPMessageValidation ポリシーの <Source> 要素が、ポリシーが実行されるフローに存在する Message 型の変数に設定されていることを確認します。

ポリシーを修正するには、Message 型の変数を指定するように <Source> 要素を変更します。たとえば、失敗した SOAPMessageValidation ポリシーでは、<Source> 要素を request と指定できます。

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://sample.com"> sampleObject</Element>
    <SOAPMessage/>
    <Source>request</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

失敗

エラーコード

steps.messagevalidation.Failed

エラー レスポンスの本文

{
  "fault": {
    "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

エラー レスポンスの本文の例

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

原因

このエラーは、SOAPMessageValidation ポリシーが、XSD スキーマまたは WSDL 定義に対する入力メッセージ ペイロードを検証できなかった場合に発生します。また、ペイロード メッセージ内の JSON または XML の形式が正しくない場合にも発生します。

このエラーの原因として、以下が考えられます。

原因 説明
XML ペイロードの不一致 入力 XML ペイロードが、SoapMessageValidation ポリシーで指定された XSD スキーマに準拠していません。
SOAP ペイロードの不一致 入力 SOAP ペイロードが、SoapMessageValidation ポリシーで指定された WSDL 定義に準拠していません。
JSON または XML が正しくない 入力 SOAP ペイロードに、適切な形式の XML または JSON が含まれていません。

原因: XML ペイロードの不一致

このエラーは、入力 XML ペイロードが SoapMessageValidation ポリシーの <ResourceURL> 要素で指定された XSD スキーマに準拠していない場合に発生します。

エラー メッセージの例

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

診断

  1. SOAPMessageValidation ポリシー名、失敗の理由、XSD スキーマと一致しない XML ペイロードの行番号を特定します。この情報はすべて障害文字列に含まれます。たとえば、次の障害文字列では、SOAPMessageValidation ポリシーの名前は SOAP-Message-Validation-1,、失敗の理由は Expecting a child element but found none [Line 9]、行番号は 9 です。

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. SOAPMessageValidation ポリシーを調べて、XSD スキーマ定義ファイルを使用してメッセージを検証することを確認します。たとえば、次の SOAPMessageValidation ポリシーでは、<ResourceURL> 要素に XSD リソース ファイルが含まれています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. 上記のステップ 1 で特定した行番号の入力ペイロードを確認し、問題の原因を特定します。

    入力 XML ペイロードのサンプル

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <shipOrder
        xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
        <shipTo>
            <name>Karl Kalckstein</name>
        </shipTo>
        <items>
            <item>
                <title>I love APIs</title>
                <quantity>1</quantity>
                <price>2.90</price>
            </item>
        </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    上記の例では、9 行目に </shipTo> 終了タグがあります。

  4. SOAPMessageValidation ポリシーで使用される XML スキーマ定義ファイル Script-1.xsd を調べて、<shipTo> 要素がどのように表示されるかを確認します。

    ...
    <xsd:element name="shipTo" type="shipAddress"/>
    ...
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    <xsd:element name="country" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    ...
    

    検証に使用されるサンプル XSD によると、<shipTo> 要素に子要素 <name><street><address><country> が必要です。しかし、入力 XML ペイロードには、子要素 <name> しかありません。結果として、次のエラーが発生します。

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    

解決策

この検証エラーを解決する方法は 2 つあります。

ソリューション 1

XSD スキーマ定義が不要な制限を適用しており、<shipTo> 要素の下で <name> 子要素のみが必要であると判断した場合、SOAPMessageValidation ポリシーで使用される Script-1.xsd を変更できます。上記のペイロードの例を検証するには、次のように XSD ファイルを変更します。

...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

ソリューション 2

XSD 定義ファイルが正しい場合は、入力 XML ペイロードを xsd と一致するように変更できます。たとえば、xsd に準拠するようにペイロードを次のように変更できます。

<?xml version="1.0">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>
</shipOrder>
</soap:Body>
</soap:Envelope>

原因: SOAP ペイロードの不一致

このエラーは、入力 SOAP ペイロードが SoapMessageValidation ポリシーの <ResourceURL> 要素で指定された WSDL 定義に準拠していない場合に発生します。

エラー メッセージの例

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

診断

  1. SOAPMessageValidation ポリシー名、失敗の理由、WSDL 定義と一致しない SOAP ペイロードの行番号を特定します。この情報はすべて障害文字列から確認できます。たとえば、次の障害文字列では、SOAPMessageValidation ポリシーの名前は SOAP-Message-Validation-1、失敗の理由は \"Element name mismatch. Wildcard? [Line 11]\""、行番号は 11 です。

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. SOAPMessageValidation ポリシーを調べて、wsdl スキーマを使用してメッセージを検証することを確認します。たとえば、次の SOAPMessageValidation ポリシーでは、<ResourceURL> 要素に wsdl リソース ファイルが含まれています。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
     <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
    </MessageValidation>
    
  3. ステップ 1 で特定した行番号の入力ペイロードを確認し、問題の原因を特定します。

    入力 SOAP ペイロードの例

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder
    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</title>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    

    上記の例では、11 行目の <shipTo> 要素に子要素 <country> があります。

  4. SOAPMessageValidation ポリシーで使用される WSDL 定義ファイル SOAP-Message-Validation-1.wsdl を調べて、<shipTo> 要素の下の子要素 <country> の何が問題かを確認します。

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
          <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="shipOrder" type="order"/>
    <xsd:complexType name="order">
    <xsd:sequence>
    <xsd:element name="shipTo" type="shipAddress"/>
    <xsd:element name="items" type="cdItems"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    </xsd:sequence>
    ...
    

    検証に使用される WSDL 定義によると、<shipTo> 要素に <country> 子要素がありません。結果として、次のエラーが発生します。

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    

解決策

この検証エラーを解決する方法は 2 つあります。

ソリューション 1

使用される WSDL 定義が間違っていると判断した場合、SOAPMessageValidation ポリシーで使用される SOAP-Message-Validation-1.wsdl を変更できます。上記のペイロードの例を検証するには、次のようにファイルを変更します。

...
<xsd:complexType name="shipAddress">`
...
<sequence>
    <element name="name" type="xsd:string"/>
    <element name="street" type="xsd:string"/>
    <element name="address" type="xsd:string"/>
    <element name="country" type="xsd:string"/>
</sequence>

ソリューション 2

WSDL 定義が正しい場合は、入力 SOAP ペイロードを WSDL 定義と一致するように変更できます。

たとえば、入力 SOAP ペイロードを次のように変更できます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>

原因: JSON または XML が正しくない

このエラーは、入力 SOAP ペイロードが SoapMessageValidation ポリシーの <ResourceURL> 要素で指定された WSDL 定義に準拠していない場合に発生します。

エラー メッセージの例

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly  around char 420)\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

診断

  1. SOAPMessageValidation ポリシー名、失敗の理由、WSDL 定義と一致しない XML ペイロードの行番号を特定します。この情報はすべて障害文字列から確認できます。たとえば、次の障害文字列では、SOAPMessageValidation ポリシーの名前は SOAP-Message-Validation-1、失敗の理由は Expected </title> at line 15(possibly around char 420):、行番号は 15. です

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. 上記のステップ 1 で特定した行番号の入力ペイロードを確認し、問題の原因を特定します。

    入力 SOAP ペイロードの例

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</titles>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    上記の例では、入力 XML の 15 行目に要素 <title> がありますが、</title> 終了タグを使って閉じられていません。

解決策

このエラーを解決するには、入力ペイロードが有効で、形式が正しいことを確認してください。

たとえば、次のように入力 XML ペイロードを変更できます。

...
</shipTo>
<items>
  <item>
    <title>I love APIs</title>
    <quantity>1</quantity>
    <price>2.90</price>
  </item>
</items>
...