java - GraphQL Java 未正确检测 kotlin 枚举
问题描述
我正在使用 graphql spring boot kickstarter - https://github.com/graphql-java-kickstart/graphql-spring-boot来创建 spring graphql 服务。我正在使用 kotlin 构建实际的服务。
我在我的 graphql 服务中声明了一个枚举类型,我也在我的 kotlin 代码中声明了它。这是我为另一个枚举(TimeUnit)所做的事情,但对于新的枚举(WeekDay)我收到了一个错误
我尝试为枚举类型创建一个显式解析器,但无济于事。
package com.houseshare.server.data.entity
import com.vladmihalcea.hibernate.type.array.IntArrayType
import org.hibernate.annotations.GenericGenerator
import org.hibernate.annotations.TypeDef
import org.hibernate.annotations.TypeDefs
import java.util.*
import javax.persistence.*
import javax.validation.constraints.Size
@Entity
@Table(name = "scheduler")
@TypeDefs(
TypeDef(
typeClass = IntArrayType::class,
defaultForType = Array<Int>::class
)
)
class Scheduler(
@Id @GeneratedValue(generator = "UUID")
@GenericGenerator(
name = "UUID",
strategy = "org.hibernate.id.UUIDGenerator"
) val id: UUID = UUID.randomUUID(),
@Column(length = 50)
@Size(max = 50)
var name: String,
@Column
var duration: Int? = null,
@Column
@Enumerated(EnumType.ORDINAL)
var durationUnit: TimeUnit? = null,
@Column
var frequency: Int? = null,
@Column
@Enumerated(EnumType.ORDINAL)
var frequencyUnit: TimeUnit? = null,
@Column
var scheduleDays: Array<Int>? = null,
@Column
@Temporal(TemporalType.TIME)
var scheduleTime: Date? = null,
@Column
var effort: Int? = null
) {
override fun toString(): String {
return "Scheduler [id= + ${this.id}]";
}
fun getScheduleDaysList() : List<WeekDay>? {
return scheduleDays?.map { WeekDay.fromInt(it) }
}
fun setScheduleDaysList(daysOfWeek : List<WeekDay>?) {
if(daysOfWeek == null) {
this.scheduleDays = null;
} else {
this.scheduleDays = daysOfWeek.map { it.value }.toTypedArray();
}
}
}
enum class TimeUnit {
MINUTE, HOUR, DAY, WEEK, MONTH
}
enum class WeekDay(val value: Int) {
MONDAY(1),
TUESDAY(2),
WEDNESDAY(3),
THURSDAY(4),
FRIDAY(5),
SATURDAY(6),
SUNDAY(7);
companion object {
fun fromInt(value: Int) = WeekDay.values().first { it.value == value }
}
}
Graphql 架构:
type Scheduler {
id: ID!,
name: String!
duration: Int,
durationUnit: TimeUnit,
frequency: Int,
frequencyUnit: TimeUnit,
scheduleDays: [WeekDay],
scheduleTime: Time
}
type Time
enum TimeUnit {
MINUTE,
HOUR,
DAY,
WEEK,
MONTH
}
enum WeekDay {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
产生的错误信息是:
Type 'WeekDay' is declared as an enum in the GraphQL schema but is not a Java enum!
解决方案
通过为 Scheduler 创建自定义解析器并在此处声明类型和转换来解决此问题
推荐阅读
- javafx - JavaFx- 根据输入动态克隆选项卡
- javascript - 删除旧的填充矩形,清除矩形不起作用?
- javascript - 通过 JavaScript 调整视频大小问题
- laravel-5 - Laravel 会话消息作为 toastr 通知
- javascript - 混合 android 应用程序在构建后无法正常工作
- angular - Angular:绑定到服务的可观察属性 - >值不会更新
- python - Linux 和 Windows 在 Python 寻址 CSV 文件中的区别
- node.js - npm install angular-cli 不工作
- sparql - 我想在基于 Lahman Baseball 数据库的 sparql 中进行选择查询和连接两个数据集
- android - 使用 Flutter 时我有哪些存储数据的选项?(iOS 和安卓)