Ошибка выполнения Graphql при использовании входного объекта с Enum - PullRequest
0 голосов
/ 13 апреля 2020

Я получаю следующую ошибку времени выполнения при вызове моей мутации createTest. У меня есть входной объект, который называется testCreationRequest, который содержит как перечисление, так и другой пользовательский тип, который также содержит перечисление. Я получаю одинаковую ошибку для обоих этих случаев. Я попытался переопределить форматеры json и несколько вещей, касающихся последствий, и заменить значения на сангрии 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
  }
}

Следующий фрагмент содержит мои типы графиков

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)
}

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Любая помощь приветствуется:)

...