将 graphql 枚举映射到 kotlin 枚举
Posted
技术标签:
【中文标题】将 graphql 枚举映射到 kotlin 枚举【英文标题】:mapping a graphql enum to a kotlin enum 【发布时间】:2019-08-14 14:55:16 【问题描述】:我对 Graphql 和 Kotlin 都很陌生,我遇到了一个问题。我有一个名为成分的对象(kotlin 中的数据类,输入 graphql)。成分有一个名称和一个 ID,两个字符串,一个 vegan 和 glutenfree 值,两个枚举。
我遇到的问题是,当我尝试创建具有突变的成分时,我得到 Vegan 和 GlutenFree 的类型不匹配,它需要“type.Vegan”并找到“me.paxana.myapplication.models .Vegan”
这是我用来创建成分的函数。由于上面提到的类型不匹配,其中的成分.vegan 和成分.gf 带有下划线。
fun createIngredient(ingredient: Ingredient )
val createIngredientInput = CreateIngredientInput.builder().name(ingredient.name).vegan(ingredient.vegan).gf(ingredient.gf).build()
mAWSAppSyncClient!!.mutate(CreateIngredientMutation.builder().input(createIngredientInput).build())
.enqueue(mutationCallback)
这是成分数据类:
data class Ingredient(val id: String, val name: String, val vegan: Vegan = Vegan.UNKNOWN, val gf: GlutenFree = GlutenFree.UNKNOWN )
这是我的 Vegan 枚举类
enum class Vegan
VEGAN, NONVEGAN, UNKNOWN
这是我的 graphQL 架构
input CreateIngredientInput
name: String!
vegan: Vegan
gf: GlutenFree
input DeleteIngredientInput
id: ID!
enum GlutenFree
GLUTENFREE
CONTAINSGLUTEN
UNKNOWN
type Ingredient
id: ID!
name: String!
vegan: Vegan
gf: GlutenFree
type IngredientConnection
items: [Ingredient]
nextToken: String
input ModelBooleanFilterInput
ne: Boolean
eq: Boolean
input ModelFloatFilterInput
ne: Float
eq: Float
le: Float
lt: Float
ge: Float
gt: Float
contains: Float
notContains: Float
between: [Float]
input ModelIDFilterInput
ne: ID
eq: ID
le: ID
lt: ID
ge: ID
gt: ID
contains: ID
notContains: ID
between: [ID]
beginsWith: ID
input ModelIntFilterInput
ne: Int
eq: Int
le: Int
lt: Int
ge: Int
gt: Int
contains: Int
notContains: Int
between: [Int]
enum ModelSortDirection
ASC
DESC
input ModelStringFilterInput
ne: String
eq: String
le: String
lt: String
ge: String
gt: String
contains: String
notContains: String
between: [String]
beginsWith: String
type Mutation
createIngredient(input: CreateIngredientInput!): Ingredient
updateIngredient(input: UpdateIngredientInput!): Ingredient
deleteIngredient(input: DeleteIngredientInput!): Ingredient
type Query
getIngredient(id: ID!): Ingredient
listIngredients(filter: TableIngredientFilterInput, limit: Int, nextToken: String): IngredientConnection
type Subscription
onCreateIngredient(
id: ID,
name: String,
vegan: Vegan,
gf: GlutenFree
): Ingredient
@aws_subscribe(mutations: ["createIngredient"])
onUpdateIngredient(
id: ID,
name: String,
vegan: Vegan,
gf: GlutenFree
): Ingredient
@aws_subscribe(mutations: ["updateIngredient"])
onDeleteIngredient(
id: ID,
name: String,
vegan: Vegan,
gf: GlutenFree
): Ingredient
@aws_subscribe(mutations: ["deleteIngredient"])
input TableBooleanFilterInput
ne: Boolean
eq: Boolean
input TableFloatFilterInput
ne: Float
eq: Float
le: Float
lt: Float
ge: Float
gt: Float
contains: Float
notContains: Float
between: [Float]
input TableIDFilterInput
ne: ID
eq: ID
le: ID
lt: ID
ge: ID
gt: ID
contains: ID
notContains: ID
between: [ID]
beginsWith: ID
input TableIngredientFilterInput
id: TableIDFilterInput
name: TableStringFilterInput
vegan: TableBooleanFilterInput
gf: TableBooleanFilterInput
input TableIntFilterInput
ne: Int
eq: Int
le: Int
lt: Int
ge: Int
gt: Int
contains: Int
notContains: Int
between: [Int]
input TableStringFilterInput
ne: String
eq: String
le: String
lt: String
ge: String
gt: String
contains: String
notContains: String
between: [String]
beginsWith: String
input UpdateIngredientInput
id: ID!
name: String
vegan: Vegan
gf: GlutenFree
enum Vegan
VEGAN
NONVEGAN
UNKNOWN
【问题讨论】:
【参考方案1】:好的,所以在我的项目上运行 amplify codegen
之后,我有了一个可以使用的 type.Vegan 和 type.GlutenFree 枚举,所以我摆脱了本地的 kotlin 枚举并创建了成分对象 type.Vegan 的属性并输入.GlutenFree。
像魅力一样工作。
【讨论】:
以上是关于将 graphql 枚举映射到 kotlin 枚举的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxJava 生成一个映射,其中键是 Kotlin 枚举的值,映射的值来自另一个 RxJava 流
如何使用 JPA 将 MySQL 枚举映射到 Java 枚举? [复制]