메시지 할당 런타임 오류 문제 해결

ApigeeApigee Hybrid 문서입니다.
Apigee Edge 문서 보기

UnresolvedVariable

오류 코드

steps.assignmessage.UnresolvedVariable

오류 응답 본문

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

원인

이 오류는 Assign Message 정책에 지정된 변수가 다음 중 하나인 경우에 발생합니다.

  • 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
  • 확인할 수 없는 경우(정의되지 않음)

예를 들어 Assign Message 정책이 요청 흐름에서 실행되지만 <Copy> 요소의 source 속성이 response 또는 error 변수 또는 요청 흐름에 존재하지 않는 다른 커스텀 변수로 설정된 경우 이 오류가 발생합니다.

진단

  1. 오류가 발생한 Assign Message 정책 및 사용할 수 없는 변수의 이름을 확인합니다. 두 항목은 모두 오류 응답의 faultstring 요소에서 찾을 수 있습니다.

    예를 들어 다음 faultstring에서 정책 이름은 googleBook이고 변수는 var입니다.

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. 실패한 Assign Message 정책 XML에서 사용된 변수 이름이 위 1단계의 오류 문자열에서 식별된 변수 이름과 일치하는지 확인합니다. 예를 들어 다음 정책은 <Copy> 요소의 소스 속성을 faultstring에 있는 내용과 일치하는 var라는 변수로 설정합니다.

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. 변수가 Assign Message 정책이 실행되는 흐름에서 정의되고 사용 가능한지 확인합니다.

  4. 변수가 다음 중 하나인 경우

    1. 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
    2. 확인할 수 없는 경우(정의되지 않음)

    이는 오류의 원인이 됩니다.

    예를 들어 위에 표시된 Assign Message 정책이 요청 흐름에서 실행된다고 가정해 보겠습니다. 요청 흐름의 Assign Message 정책 이전에 실행된 정책에 var 변수가 정의되어 있는지 확인합니다. 변수가 정의되지 않은 경우 다음과 같은 오류 코드가 표시됩니다.

    steps.assignmessage.UnresolvedVariable
    

해결 방법

정책에서 참조하는 변수가 존재하고 Assign Message 정책이 실행되는 특정 흐름에서 사용할 수 있는지 확인합니다.

위의 예시 정책을 수정하려면 <Copy> 요소의 소스 속성을 요청 변수로 수정하거나 요청 흐름에 있는 다른 메시지 유형의 커스텀 변수로 수정하면 됩니다.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

오류 코드

steps.assignmessage.VariableOfNonMsgType

오류 응답 본문

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

원인

이 오류는 <Copy> 요소의 source 속성이 메시지 유형이 아닌 변수로 설정된 경우에 발생합니다.

메시지 유형 변수는 전체 HTTP 요청 및 응답을 나타냅니다. 기본 제공 흐름 변수 request, response, message는 메시지 유형입니다. message 변수에 대한 자세한 내용은 변수 참조를 확인하세요.

진단

  1. 오류가 발생한 Assign Message 정책 및 유형이 잘못된 변수 이름을 식별합니다. 두 항목은 모두 오류 응답의 faultstring 요소에서 찾을 수 있습니다. 예를 들어 다음 faultstring에서 정책 이름은 GenerateGeocodingRequest이고 변수는 PostalCode입니다.

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. 실패한 Assign Message 정책 XML에서 <Copy> 요소에 설정된 변수 이름이 위의 1단계의 오류 문자열에서 식별된 변수 이름과 일치하는지 확인합니다. 예를 들어 다음 정책은 소스 속성을 faultstring의 내용과 일치하는 PostalCode라는 변수로 설정합니다.

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  3. 이 변수의 유형이 메시지인지 확인합니다.

    1. 변수가 먼저 정의된 API 프록시 번들 내에서 코드를 찾습니다.
    2. 정책에서 변수가 먼저 정의되고 채워지는 것을 확인한 다음에는 다음과 같이 해당 변수의 유형을 확인해야 합니다.
      1. 유형 속성의 값을 확인합니다(있는 경우).
      2. 유형 속성이 없으면 변수가 문자열로 간주됩니다.
    3. 변수 유형이 메시지가 아닌 경우(예: 문자열) 이는 오류의 원인이 됩니다. 일반적인 변수 및 유형에 대해서 알아보려면 변수 참조를 확인하세요.

    예를 들어 위의 XML에서 PostalCode 변수를 살펴봅니다. <AssignVariable> 요소의 흐름 변수 request.queryparam.postalcode 값이 할당됩니다. 변수 할당에 유형 속성이 없기 때문에 이 값은 문자열입니다.

    이제 Assign Message 정책의 <Copy> 요소에 PostalCode 변수가 사용됩니다.

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    PostalCode는 메시지 유형이 아니므로(이 예시에서는 문자열) 다음과 같은 오류 코드를 받게 됩니다.

    steps.assignmessage.VariableOfNonMsgType
    

해결 방법

실패한 Assign Message 정책의 <Copy> 요소에 있는 source 속성이 존재하는 메시지 유형 흐름 변수로 설정되어 있는지 확인합니다.

정책을 수정하려면 <Copy> 요소에서 source 속성을 수정하여 메시지 유형의 변수를 지정하면 됩니다. 예를 들어 요청 흐름에서 Assign Message 정책을 실행해야 하는 경우 메시지 유형 변수 request 또는 메시지 유형의 다른 커스텀 변수를 사용할 수 있습니다.

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>