현재 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> 요소가 정책이 실행되는 흐름에 존재하지 않는 변수로 설정된 경우 이 오류가 발생합니다.
진단
- 오류가 발생하는 SOAPMessageValidation 정책 이름과 오류 문자열의 - source변수 이름을 식별합니다. 예를 들어 다음 오류 문자열에서 SOAPMessageValidation 정책 이름은- SOAP-Message-Validation-1이고- source변수는- request입니다.- "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
- 실패한 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>
- <Source>요소에 사용된 변수가 정의되었고 SOAPMessageValidation 정책이 실행되는 흐름에서 사용할 수 있는지 확인합니다.- 변수가 다음 중 하나인 경우 - 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
- 확인할 수 없는 경우(정의되지 않음)
 - 이는 오류의 원인이 됩니다. - 예를 들어 위에 있는 SOAPMessageValidation 정책이 응답 흐름에서 실행된다고 가정해 봅시다. 하지만 위의 - <Source>요소 예시에서 사용한- request변수는 요청 흐름에서만 사용할 수 있습니다.- 응답 흐름에 - request변수가 없으므로 다음과 같은 오류가 발생합니다.- "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
해결 방법
실패한 SOAPMessageValidation 정책의 <Source> 요소에 설정된 변수가 정의되고 정책이 실행되는 흐름에 있는지 확인합니다.
위의 예시를 수정하려면 <Source> 요소를 수정하여 응답 흐름에 있는 response 변수를 사용할 수 있습니다.
<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> 요소가 메시지 유형이 아닌 변수로 설정된 경우 발생합니다.
메시지 유형 변수는 전체 HTTP 요청 및 응답을 나타냅니다. 기본 제공되는 Apigee Edge 흐름 변수 request, response, message는 메시지 유형입니다. message 변수에 대한 자세한 내용은 변수 참조를 확인하세요.
진단
- 오류 문자열에서 메시지 유형으로 확인되지 않는 변수의 이름을 식별합니다. 예를 들어 다음 오류 문자열에서 변수 이름은 - message.content입니다.- "faultstring": "Variable message.content does not resolve to a Message"
- 오류가 발생한 특정 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가 메시지 유형이 아니므로 오류가 발생합니다.- "faultstring": "Variable message.content does not resolve to a Message"
해결 방법
실패한 SOAPMessageValidation 정책의 <Source> 요소가 정책이 실행되는 흐름에 있는 메시지 유형 변수로 설정되었는지 확인합니다.
정책을 수정하려면 <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"
    }
  }
}
진단
- SOAPMessageValidation 정책 이름, 실패 이유, XML 페이로드가 XSD 스키마와 일치하지 않는 줄 번호를 식별합니다. 이러한 모든 정보는 오류 문자열에 있습니다. 예를 들어 다음 오류 문자열에서 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]\""
- 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>
- 위의 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>종료 태그가 있습니다.
- 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]\""
해결 방법
이 유효성 검사 오류를 해결하는 방법은 두 가지가 있습니다.
솔루션 #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"
    }
  }
}
진단
- SOAPMessageValidation 정책 이름, 실패 이유, SOAP 페이로드가 WSDL 정의와 일치하지 않는 줄 번호를 식별합니다. 이러한 모든 정보는 오류 문자열에서 찾을 수 있습니다. 예를 들어 다음 오류 문자열에서 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]\""
- 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>
- 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>가 있습니다.
- 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]\""
해결 방법
이 유효성 검사 오류를 해결하는 방법은 두 가지가 있습니다.
솔루션 #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"
    }
  }
}
진단
- 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)\""
- 위의 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>
...