ねえ、すべて。私はsangria-graphqlを使用していますが、すべてうまくいきます...インラインフラグメントを除いて。私は、スキーマで次の種類があります。sangria-graphql:インラインフラグメントが解決されない
interface Entity {
oid: ID!
}
type Dataset implements Entity {
oid: ID!
name: String
... (other fields)
}
... (other types implementing Entity)
type Issue {
entity: Entity!
... (other fields)
}
type Query {
validate(many arguments): [Issue!]
... (other queries)
}
私はこのようなクエリの送信:OIDが返されるにもかかわらず
{
validate(many arguments) {
entity {
oid
... on Dataset {
name
}
}
}
は、データセットのインスタンスで、名前がそれに返されないことです。これは、リゾルバがこれがDatasetのインスタンスであることを知らず、Entityのインスタンスとしてのみ扱います。
実装の詳細
import sangria.schema._
import sangria.ast.Document
import play.api.libs.json._
// document is an instance of Document
lazy val schema: Schema[Ctx, Any] =
Schema.buildFromAst(document, new DefaultAstSchemaBuilder[Ctx] {
override def resolveField(typeDefinition: TypeDefinition,
fieldDefinition: FieldDefinition) =
typeDefinition.name match {
case "Mutation" => context =>
fieldDefinition.name match {
... // cases for specific mutations
}
case "Query" => context =>
fieldDefinition.name match {
case "validate" =>
... // implementation that returns a Seq[JsValue],
// where the Json values are serializations of Issue
... // cases for other queries
}
case _ => context =>
... // resolve the sub-selection fields as described below
}
}
次のようにサブ選択フィールドが解決される:
context.value
がJsObject
ある場合、そのスキーマを実装resolveField
方法で、GraphQL文書からSchema.buildFromAst
方法を用いて構成されていますJsonフィールドの名前はcontext.field.name
です。context.value
がJsString
である場合、それはエンティティのoidとして解釈され、エンティティはCtx
コンテキストによって提供されるハンドルを使用してストア内で検索されます。エンティティはJsObject
として取得され、context.field.name
という名前のJsonフィールドが取得されます。
前述のように、問題はインラインフラグメントが尊重されないということです。おそらく、私は何かを欠いている。たぶん、resolveField
だけでなく、他のものも適切に実装する必要があります。おそらく、私の実装ではresolveField
の何かが間違っています。
あなたは何をお勧めしますか?あなたの意見では、どこに問題があるのでしょうか?問題を解決するために私が何をすることをお勧めしますか?
ありがとうございます!私が探していた方法のように見えます。 – silverberry