为什么我的 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"')
现在比较按预期进行了。不确定这是否是解决问题的最佳方法,但它让我解决了这个问题。
我正在为 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"')
现在比较按预期进行了。不确定这是否是解决问题的最佳方法,但它让我解决了这个问题。