首页 > 解决方案 > AWS 教程:GraphQL 构建因缺少符号和太多参数而失败

问题描述

我正在尝试完成有关 Android/GraphQL 的 AWS 教程,但失败得很惨。我的构建在来自以下命令的自动生成的一段代码上失败

amplify codegen models

用作源的架构是...

type NoteData
@model
@auth (rules: [ { allow: owner } ]) {
    id: ID!
    name: String!
    description: String
    image: String
}

...生成代码的失败部分是...

/** This is an auto generated class representing the NoteData type in your schema. */
@SuppressWarnings("all")
@ModelConfig(pluralName = "NoteData", authRules = {
  @AuthRule(allow = AuthStrategy.OWNER, ownerField = "owner", identityClaim = "cognito:username", **provider** = "userPools", operations = { ModelOperation.CREATE, ModelOperation.UPDATE, ModelOperation.DELETE, ModelOperation.READ })
})
public final class NoteData implements Model {
  public static final QueryField ID = field("NoteData", "id");
  public static final QueryField NAME = field("NoteData", "name");
  public static final QueryField DESCRIPTION = field("NoteData", "description");
  public static final QueryField IMAGE = field("NoteData", "image");
  private final @ModelField(targetType="ID", isRequired = true) String id;
  private final @ModelField(targetType="String", isRequired = true) String name;
  private final @ModelField(targetType="String") String description;
  private final @ModelField(targetType="String") String image;
  private @ModelField(targetType="AWSDateTime", **isReadOnly** = true) Temporal.DateTime createdAt;
  private @ModelField(targetType="AWSDateTime", **isReadOnly** = true) Temporal.DateTime updatedAt;
  public String getId() {
      return id;
  }

我的构建错误是...

C:\Users\yawbe\AndroidStudioProjects\AndroidGettingStarted\app\src\main\java\com\amplifyframework\datastore\generated\model\NoteData.java:25: error: cannot find symbol
  @AuthRule(allow = AuthStrategy.OWNER, ownerField = "owner", identityClaim = "cognito:username", provider = "userPools", operations = { ModelOperation.CREATE, ModelOperation.UPDATE, ModelOperation.DELETE, ModelOperation.READ })
                                                                                                  ^
  symbol:   method provider()
  location: @interface AuthRule
C:\Users\yawbe\AndroidStudioProjects\AndroidGettingStarted\app\src\main\java\com\amplifyframework\datastore\generated\model\NoteData.java:36: error: cannot find symbol
  private @ModelField(targetType="AWSDateTime", isReadOnly = true) Temporal.DateTime createdAt;
                                                ^
  symbol:   method isReadOnly()
  location: @interface ModelField
C:\Users\yawbe\AndroidStudioProjects\AndroidGettingStarted\app\src\main\java\com\amplifyframework\datastore\generated\model\NoteData.java:37: error: cannot find symbol
  private @ModelField(targetType="AWSDateTime", isReadOnly = true) Temporal.DateTime updatedAt;
                                                ^
  symbol:   method isReadOnly()
  location: @interface ModelField
C:\Users\yawbe\AndroidStudioProjects\AndroidGettingStarted\app\src\main\java\com\amplifyframework\datastore\generated\model\NoteData.java:28: error: method field in class QueryField cannot be applied to given types;
  public static final QueryField ID = field("NoteData", "id");
                                      ^
  required: String
  found: String,String
  reason: actual and formal argument lists differ in length
C:\Users\yawbe\AndroidStudioProjects\AndroidGettingStarted\app\src\main\java\com\amplifyframework\datastore\generated\model\NoteData.java:29: error: method field in class QueryField cannot be applied to given types;
  public static final QueryField NAME = field("NoteData", "name");
                                        ^
  required: String
  found: String,String
  reason: actual and formal argument lists differ in length
C:\Users\yawbe\AndroidStudioProjects\AndroidGettingStarted\app\src\main\java\com\amplifyframework\datastore\generated\model\NoteData.java:30: error: method field in class QueryField cannot be applied to given types;
  public static final QueryField DESCRIPTION = field("NoteData", "description");
                                               ^
  required: String
  found: String,String
  reason: actual and formal argument lists differ in length
C:\Users\yawbe\AndroidStudioProjects\AndroidGettingStarted\app\src\main\java\com\amplifyframework\datastore\generated\model\NoteData.java:31: error: method field in class QueryField cannot be applied to given types;
  public static final QueryField IMAGE = field("NoteData", "image");
                                         ^
  required: String
  found: String,String
  reason: actual and formal argument lists differ in length

所以这看起来像两个未定义的符号和四个变量数量错误的调用。采用后者,工具提示显示以下用法,它确实请求单个参数。

public static QueryField field(String fieldName)

我不知道为什么自动生成的代码有两个但是如果我删除第一个参数

field("NoteData", "image") 

变成

field("image")

这真的会解决问题吗,还是会在给我创建一整套新的运行时问题的同时对构建错误进行排序?

回到两个未定义的符号,它们似乎没有缺少导入,而是定义和生成的代码之间不兼容。AuthRule 的源没有定义提供程序字段,因此这似乎是错误的一个明显原因,但我不明白为什么 amplify 将它放在首位以及需要替换它的内容(大概是什么? )。isReadOnly 也是如此,它没有定义,所以为什么要放大尝试使用它?

希望有人能直截了当地告诉我,到目前为止,我非常了解所有其他代码,但正是这个放大生成的文件让我头疼。

标签: amazon-web-servicesgraphqlaws-amplify

解决方案


如果您对 Gradle 库版本进行以下更改,则不会出现构建错误

implementation 'com.amplifyframework:aws-api:1.24.0'
implementation 'com.amplifyframework:aws-auth-cognito:1.24.0'

推荐阅读