2017-08-03 24 views
0

ねえ、すべて。私は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.valueJsObjectある場合、そのスキーマを実装resolveField方法で、GraphQL文書からSchema.buildFromAst方法を用いて構成されていますJsonフィールドの名前はcontext.field.nameです。
  • context.valueJsStringである場合、それはエンティティのoidとして解釈され、エンティティはCtxコンテキストによって提供されるハンドルを使用してストア内で検索されます。エンティティはJsObjectとして取得され、context.field.nameという名前のJsonフィールドが取得されます。

前述のように、問題はインラインフラグメントが尊重されないということです。おそらく、私は何かを欠いている。たぶん、resolveFieldだけでなく、他のものも適切に実装する必要があります。おそらく、私の実装ではresolveFieldの何かが間違っています。

あなたは何をお勧めしますか?あなたの意見では、どこに問題があるのでしょうか?問題を解決するために私が何をすることをお勧めしますか?

答えて

1

汎用JsValueで作業しているので、DefaultAstSchemaBuilder.objectTypeInstanceCheckも上書きする必要があります。特定のGraphQLタイプのものかどうかをライブラリに伝える必要があります(JsValue)。たとえば、エンティティJSONに{"type": "Dataset", ...}のようなフィールドがある場合は、指定されたObjectTypeの名前と照合する必要があります。

+0

ありがとうございます!私が探していた方法のように見えます。 – silverberry

関連する問題