【发布时间】: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