为什么我的 Velocity 模板语言条件不起作用?

Why is my Velocity Template Language conditional not working?

我正在为 AWS API 网关端点构建一个响应模板来处理错误。传入的 JSON 错误消息类似于以下内容之一:

{
    "__type": "UserNotFoundException",
    "message": "User does not exist."
}

{
    "__type": "NotAuthorizedException",
    "message": "Incorrect username or password."
}

{
    "__type": "NotAuthorizedException",
    "message": "Password attempts exceeded"
}

我的 VTL 映射模板如下所示:

#set($inputRoot = $input.path('$'))
#set($unf = "UserNotFoundException")
#set($nae = "NotAuthorizedException")
#set($type =$input.json('$.__type'))

#if($type == $unf)
{
  "__type": "UserNotFoundException",
  "message": $input.json('$.message'),
  "referenceCode": "UNF0000"
}
#elseif($type == $nae)
{
  "__type": "NotAuthorizedException",
  "message": $input.json('$.message'),
  "referenceCode": "NAE0000"
}
#else
{
  "__type": $input.json('$.__type'),
  "message": $input.json('$.message'),
  "referenceCode": "FAIL0000"
}
#end

无论我使用什么输入来触发我的 400 错误响应,它都会落入我的包罗万象的情况。在我的 else 案例中输出的 __type 匹配其他条件之一,所以我很困惑为什么他们没有捕捉到它。任何帮助,将不胜感激! (我是 AWS 和 VTL 的新手)

将字符串与 equals 进行比较(constant/not 左侧可为空),与 Java

中的相同
 #if($unf.equals($type))

进一步的故障排除表明,VTL 将我的常量字符串变量视为不带引号的字符串,而我从错误消息中提取的 JSON 对象评估为带引号的字符串。所以我的条件实际上是这样做的:

#if(UserNotFoundException == "UserNotFoundException")

所以我修改了设置常量的方式,如下所示:

#set($unf  = '"UserNotFoundException"')
#set($nae  = '"NotAuthorizedException"')

现在比较按预期进行了。不确定这是否是解决问题的最佳方法,但它让我解决了这个问题。