【问题标题】:AWS Tutorials: GraphQL build fails on missing symbols and too many argumentsAWS 教程:GraphQL 构建因缺少符号和太多参数而失败
【发布时间】:2021-09-17 11:16:39
【问题描述】:

我正在尝试通过AWS tutorial on Android/GraphQL 工作并且失败了。我的构建在以下命令自动生成的一段代码上失败

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 也是如此,它没有被定义,那么为什么 amplify 试图使用它?

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

【问题讨论】:

  • 我能够通过使用amplify-android readme 上列出的最新 gradle 依赖项来修复错误
  • 看来成功了,谢谢!

标签: amazon-web-services graphql aws-amplify


【解决方案1】:

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

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

【讨论】:

  • 这解决了我的问题。你能告诉我每次如何找到最新的稳定版本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2015-09-27
  • 2015-11-02
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
相关资源
最近更新 更多