调用我的 createTest 突变时出现以下运行时错误。我有一个输入对象,testCreationRequest
它包含一个枚举和另一个也包含枚举的自定义类型。对于这两种情况,我都会遇到相同的错误。我尝试过覆盖 json 格式化程序和一些关于隐式的事情,并用 sangrias 替换这些值InputObjectType
ReplaceInputField
。我对这个编程堆栈(包括语言)仍然很陌生,但这似乎应该是微不足道的。
Argument 'testCreationRequest' has invalid value: At path '/testEnum': error.expected.validenumvalue (line 2, column 35):\n createTest(testCreationRequest: {id: \"testing\", testEnum: ONE, nestedInputObject: {id: \"some test\", testTwoEnum: LEVELTWO}})
以下是我的graphql查询
mutation {
createTest(testCreationRequest: {
id: "testing",
testEnum: ONE,
nestedInputObject: {
id: "some test",
testTwoEnum: LEVELTWO
}
}) {
id
}
}
以下片段包含我的 graphql 类型
package models.api.graphql
import graphql.GraphQLContext
import models.db.Test.{Test, TestCreationRequest, NestedInput}
import sangria.schema._
import sangria.macros.derive._
import sangria.marshalling.playJson._
import scala.collection.immutable
object TestModels {
implicit val TestType: ObjectType[GraphQLContext, Test] =
deriveObjectType[Unit, Test](
ObjectTypeDescription("Test")
)
implicit val TestTwoEnumType: EnumType[models.enums.TestTwoEnumType] = EnumType(
"TestTwoEnumType",
Some("testing two..."),
List(
EnumValue("LEVELONE",
value = models.enums.TestTwoEnumType.LevelOne),
EnumValue("LEVELTWO",
value = models.enums.TestTwoEnumType.LevelTwo),
EnumValue("LEVELTHREE",
value = models.enums.TestTwoEnumType.LevelThree)
)
)
implicit val TestEnumType: EnumType[models.enums.TestEnumType] = EnumType(
"TestEnumType",
Some("testing..."),
List(
EnumValue("ONE",
value = models.enums.TestEnumType.One),
EnumValue("TWO",
value = models.enums.TestEnumType.Two),
EnumValue("THREE",
value = models.enums.TestEnumType.Three)
)
)
implicit val NestedType: InputObjectType[NestedInput] = deriveInputObjectType[NestedInput]()
implicit lazy val TestCreationRequestType: InputObjectType[TestCreationRequest] =
deriveInputObjectType[TestCreationRequest](
ReplaceInputField("testEnum", InputField("testEnum", TestEnumType)),
ReplaceInputField("nestedInputObject", InputField("nestedInputObject", OptionInputType(NestedType)))
)
val TestCreationRequestArg: Argument[TestCreationRequest] = Argument("testCreationRequest", TestCreationRequestType)
}
这是模型和枚举。
package models.db.Test
import models.enums.{TestEnumType, TestTwoEnumType}
import play.api.libs.json.{Json, OFormat}
case class NestedInput (
id: String,
testTwoEnum: Option[TestTwoEnumType]
)
object NestedInput {
implicit val format: OFormat[NestedInput] = Json.format[NestedInput]
}
case class TestCreationRequest (
id: String,
testEnum: TestEnumType,
nestedInputObject: Option[NestedInput]
)
object TestCreationRequest {
implicit val format: OFormat[TestCreationRequest] = Json.format[TestCreationRequest]
}
package models.db.Test
import play.api.libs.json.{Json, OFormat, OWrites, Reads}
case class Test(
id: String
)
object Test {
implicit val reads: Reads[Test] = Json.reads[Test]
implicit val writes: OWrites[Test] = Json.writes[Test]
implicit val format: OFormat[Test] = Json.format[Test]
}
package models.enums
import enumeratum._
import play.api.libs.json.{Format}
import scala.collection.immutable
sealed trait TestEnumType extends EnumEntry
object TestEnumType extends Enum[TestEnumType] with PlayJsonEnum[TestEnumType] {
val values: immutable.IndexedSeq[TestEnumType] = findValues
case object One extends TestEnumType
case object Two extends TestEnumType
case object Three extends TestEnumType
override implicit val jsonFormat: Format[TestEnumType] = EnumFormats.formats(TestEnumType)
}
package models.enums
import enumeratum._
import play.api.libs.json.{Format}
import scala.collection.immutable
sealed trait TestTwoEnumType extends EnumEntry
object TestTwoEnumType extends Enum[TestTwoEnumType] with PlayJsonEnum[TestTwoEnumType] {
val values: immutable.IndexedSeq[TestTwoEnumType] = findValues
case object LevelOne extends TestTwoEnumType
case object LevelTwo extends TestTwoEnumType
case object LevelThree extends TestTwoEnumType
override implicit val jsonFormat: Format[TestTwoEnumType] = EnumFormats.formats(TestTwoEnumType)
}
如果您需要更多详细信息,请告诉我。任何帮助表示赞赏:)