标签: vtl

解析器中的AppSync GraphQL变异服务器逻辑

我在寻找如何正确地将服务器端验证添加到我的AppSync GraphQL突变方面遇到问题.

本质上,我使用AWS仪表板来定义我的AppSync架构,因此为我创建了DynamoDB表,以及为数据设置的一些基本解析器.

不,我需要实现以下目标:

  1. 我有一个拥有inventory和的球员gold
  2. 玩家称为purchaseItem变异item_id
  3. 一旦调用此突变,我需要在解析器中执行一些检查,即检查是否item_id存在关联DynamoDB的int'Items'表,检查玩家是否有足够的黄金,再次在关联DynamoDB的'Players'表中,如果是,写入PlayersDynamoDB表通过将项目添加到他们的库存和新的减去黄金金额.

我认为实现这一目标的最有效方法是降低成本和延迟,是为AppSync使用"Apache Velocity"模板语言?

很高兴看到这个示例显示如何查询/写入DynamoDB,处理错误并正确解决突变.

vtl amazon-web-services amazon-dynamodb apache-velocity aws-appsync

7
推荐指数
1
解决办法
448
查看次数

如何使用 $util.error 在 AppSync 中发送自定义错误

我对 AppSync 错误处理有疑问。我想发送errorInfo对象以及错误响应,我尝试了$util.error. 根据文件:

\n\n

https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html

\n\n
\n

$util.error(String, String, Object, Object)

\n\n

抛出自定义错误。如果模板检测到请求或调用结果有错误,则可以在请求或响应映射模板中使用该模板。此外,还可以指定 errorType 字段、data 字段和 errorInfo 字段。数据值将添加到 GraphQL 响应中错误内的相应错误块中。注意:数据将根据查询选择集进行过滤。errorInfo 值将添加到 GraphQL 响应中错误内相应的 error\n 块中。注意:errorInfo 将不会根据查询选择集进行过滤。

\n
\n\n

这是我的 ResponseMappingTemplate 的样子:

\n\n
#if( $context.result && $context.result.errorMessage )\n  $utils.error($context.result.errorMessage, $context.result.errorType, $context.result.data), $context.result.errorInfo)\n#else\n  $utils.toJson($context.result.data)\n#end\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我在解析器上所做的:

\n\n
var result = {\n  data: null,\n  errorMessage: \'I made this error\',\n  errorType: \'ALWAYS_ERROR\',\n  errorInfo: {\n    errorCode: 500,\n    validations: [\n      {\n        fieldName: \'_\',\n        result: false,\n        reasons: [\n          \'Failed! Yay!\'\n        ]\n      }\n …
Run Code Online (Sandbox Code Playgroud)

error-handling vtl graphql graphql-js aws-appsync

7
推荐指数
1
解决办法
1万
查看次数

IntelliJ IDEA覆盖$ user

这是一个非常简单的问题,但我找不到使用SO-Search和Google的答案.

是否可以$user全局覆盖文件模板中使用的默认VTL变量,而不是在每个模板中设置它#set($user = "...")

像IntelliJ本身的某种设置脚本,我可以在哪里改变价值?

提前致谢.

顺便说一下,我正在使用IntelliJ Ultimate 12.1.6.

velocity vtl intellij-idea

6
推荐指数
1
解决办法
2960
查看次数

如何从Velocity Template Script(VTL)中抛出用户定义的异常?

如何从Velocity Template Script(VTL)中抛出用户定义的异常?

从我的速度脚本,我需要根据条件抛出异常,以便调用者可以捕获异常并向最终用户提供有用的错误消息.

例如.

#if($passwordfield1 != $passwordfield2)
throw an exception here
#elseif($passwordfield1 == $passwordfield2)
do something
#end
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如果passwordfield1和passwordfield2不匹配,则应抛出适当的异常,并且需要将其传播给最终用户.

有没有办法从速度脚本实现这一点?如果没有,请建议另一种方法.

velocity exception vtl user-defined

5
推荐指数
1
解决办法
1427
查看次数

Apache Velocity宏默认参数值

我想更新一个在许多不同的.vtl文件之间共享的宏,以包含一个新参数.但是,我只想更改我的一个.vtl文件中的调用,并保持其他文件保持不变.所以,我基本上想要添加一个可选参数,或者如果没有提供参数,则添加一个带默认值的参数.

文档(这里)提到了"#macro"部分中的可选默认值,但是经过几个小时的烦恼之后,我不能在生活中弄清楚正确的语法是什么.

所以我想采用现有的宏:

    #macro( my_macro ) 
        oldValue
    #end
Run Code Online (Sandbox Code Playgroud)

并把它变成一个宏,如:

    #macro( my_macro $param="oldValue" ) 
        $param
    #end
Run Code Online (Sandbox Code Playgroud)

我可以使用这两个调用中的任何一个正确调用它并获取指定的输出:

    #my_macro()            => oldValue
    #my_macro("newValue")  => newValue
Run Code Online (Sandbox Code Playgroud)

我已经尝试了文档中指定内容的每个排列,但找不到任何有效的方法.有谁知道正确的语法?有可能是我失踪的财产吗?

我正在使用Velocity 1.7和VelocityTools 2.0.velocimacro.arguments.strict=true 如果重要的话,我也在使用这个设置 .但是,如果没有一堆更新/重新测试,我无法轻易更改此属性.

java velocity vtl

5
推荐指数
1
解决办法
1772
查看次数

Java Spark/Velocity Templates/SQL2o

我正在将Spark Java Web Framework与Apache的Velocity Template Engine结合使用,以帮助设计一个从SQL数据库中提取数据的响应式Web应用程序.使用SQL2o我创建了一些自定义类类型的Java对象,即用户,组,站点等.

我已经检查过并填充了创建的对象列表.当我然后将我的对象列表放入一个hashmap并返回一个ModelandView时,出于某种原因我的列表就在那里但我不能在vtl中使用它的任何属性.

main方法和Spark代码的相关部分:

public static void main(String[] args) {

        WEB_LOGMGR loggr = new WEB_LOGMGR(true);
        WEB_DBMGR dbmgr = new WEB_DBMGR(true, loggr);
        Model backend = new ScadaModel(dbmgr, loggr);

        System.out.println(dataToJson(backend.getUsers()));

        staticFiles.location("/");
        staticFiles.externalLocation("/");
        String layout = "/templates/layout.vtl";
        //secure("public/keystore.jks", "password", null, null);

        before("/form", (request, response) -> {
            boolean authenticated = false;
            // ... check if authenticated
            if (!authenticated) {
                halt(401, "You are not welcome here");
            }
        });

        get("/", (req, res) -> {
            HashMap pdata = new HashMap();
            pdata.put("template", "/templates/main.vtl");
            return …
Run Code Online (Sandbox Code Playgroud)

java list vtl spark-java

5
推荐指数
1
解决办法
230
查看次数

在 AWS AppSync 查询中返回嵌套的 JSON

一般来说,我对 AppSync(和 GraphQL)很陌生,但是在将解析器连接到我们的 DynamoDB 表时遇到了一个奇怪的问题。具体来说,我们有一个嵌套 Map 结构用于我们任意构造的项目属性之一(其复杂性和形式取决于父项目的类型)——有点像这样:

"item" : {
    "name": "something",
    "country": "somewhere",
    "data" : {
        "nest-level-1a": {
            "attr1a" : "foo",
            "attr1b" : "bar",
            "nest-level-2" : {
                "attr2a": "something else",
                "attr2b": [
                    "some list element",
                    "and another, for good measure"
                ]
            }
        }
    },
    "cardType": "someType"
}
Run Code Online (Sandbox Code Playgroud)

我们随附的 GraphQL 类型如下:

type Item {
    name: String!
    country: String!
    cardType: String!
    data: AWSJSON!  ## note: it was originally String!
}
Run Code Online (Sandbox Code Playgroud)

当我们查询项目时,我们得到以下响应:

{
    "data": {
        "genericItemQuery": {
            "name": "info/en/usa/bra/visa",
            "country": "USA:BRA",
            "cardType": …
Run Code Online (Sandbox Code Playgroud)

json vtl graphql aws-appsync

5
推荐指数
1
解决办法
4298
查看次数

AppSync 中的 DynamoDB 返回值 UPDATED_OLD

我尝试使用AppSync更新DynamoDb表中的项目属性。一旦成功,我想使用该属性的先前值作为下一次调用的键(我正在使用管道解析器)。

要使用DynamoDB实现此目的,您只需将UPDATED_OLD设置为返回值即可。

我找不到任何用于指定 AppSync DynamoDB 解析器返回值的文档。我尝试过以下方法。

{
  "version" : "2018-05-29",
  "operation" : "UpdateItem",
  "key": {
        "id": $util.dynamodb.toDynamoDBJson("foo")
      },
   "condition" : {
   "expression" : "attribute_exists(id)"
    },
    "update" : {
    "expression" : "SET bar = :bar",
    "expressionValues" : {
        ":bar" :  {"S" : "$bar"}
      }
    },
    "returnValues": "UPDATED_OLD"
  }
Run Code Online (Sandbox Code Playgroud)

但它的语法无效。

"message": "Unsupported element '$[returnValues]'."
Run Code Online (Sandbox Code Playgroud)

vtl amazon-dynamodb graphql aws-appsync

5
推荐指数
1
解决办法
1466
查看次数

AppSync BatchPutItem 不保存项目

我正在尝试使用 AppSync 将多个项目批量放入 DynamoDB。当我调用解析器时,它不会引发任何错误,但不会将任何内容保存到数据库中。

架构

type BoxScore @model {
  id: ID!
  userId: String!
  gameVariant: String!
  complete: Boolean!
  failFact: BoxScoreFact @connection
  totalCorrect: Int!
}

type BoxScoreFact @model {
  id: ID!
  left: Int!
  right: Int!
  gameVariant: String!
  timestamp: Int!
  correct: Boolean!
}

input BatchAddCreateBoxScoreFactInput {
  id: ID
  left: Int!
  right: Int!
  gameVariant: String!
  timestamp: Int!
  correct: Boolean!
  boxScoreFactBoxScoreId: ID!
}
Run Code Online (Sandbox Code Playgroud)

IAM 角色:

        "Effect": "Allow",
        "Action": [
            "dynamodb:DeleteItem",
            "dynamodb:GetItem",
            "dynamodb:PutItem",
            "dynamodb:Query",
            "dynamodb:Scan",
            "dynamodb:UpdateItem",
            "dynamodb:BatchGetItem",
            "dynamodb:BatchWriteItem"
        ],
Run Code Online (Sandbox Code Playgroud)

解析器

#set($factsdata = [])
#foreach($item in …
Run Code Online (Sandbox Code Playgroud)

vtl amazon-web-services amazon-dynamodb graphql aws-appsync

5
推荐指数
1
解决办法
655
查看次数

使用映射模板添加或更新 JSON 对象的属性 (AWS API Gateway)

在我的 AWS APIGW Rest API 中,我尝试添加和/或更新提交的请求正文 (JSON) 上的属性。我能找到的每个示例都涉及构建新的 JSON 对象,而不是更新现有对象。

在集成请求映射模板中,我的传入数据正文如下所示。如果发布的是新对象,则它不会有 ID。如果它是一个现有对象,它将有一个 ID。 这里的目标是始终确保它具有 ID,方法是获取现有 ID 并将其设置回 JSON 对象或添加新 ID。

// New object getting added, No ID
{
    "first_name" : "Toby",
    "last_name" : "Keith"
}


// Existing object getting updated, Has ID
{
    "id" : "abcdef"
    "first_name" : "Toby",
    "last_name" : "Keith"
}
Run Code Online (Sandbox Code Playgroud)

我的集成请求映射模板如下所示:

## Do we have an existing id? (this is correctly pulling the existing ID)
#set( $id = $input.path('$.id') )
## If no ID, create one …
Run Code Online (Sandbox Code Playgroud)

vtl aws-api-gateway

5
推荐指数
1
解决办法
2955
查看次数