현재 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>
...