AWS 教程:GraphQL 构建因缺少符号和太多参数而失败

1 amazon-web-services graphql aws-amplify

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

amplify codegen models
Run Code Online (Sandbox Code Playgroud)

用作源的架构是...

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

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

/** 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;
  }
Run Code Online (Sandbox Code Playgroud)

我的构建错误是...

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
Run Code Online (Sandbox Code Playgroud)

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

public static QueryField field(String fieldName)
Run Code Online (Sandbox Code Playgroud)

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

field("NoteData", "image") 
Run Code Online (Sandbox Code Playgroud)

变成

field("image")
Run Code Online (Sandbox Code Playgroud)

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

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

希望有人能直接告诉我这一点,到目前为止,我几乎理解所有其他代码,但正是这个放大生成的文件让我头疼。

小智 7

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

implementation 'com.amplifyframework:aws-api:1.24.0'
implementation 'com.amplifyframework:aws-auth-cognito:1.24.0'
Run Code Online (Sandbox Code Playgroud)