Spring GraphQL 多个模式,每个文件查询

Tom*_*cek 5 spring graphql spring-graphql

如果我在 resources/graphql 文件夹中有以下两个模式,则使用 Spring-GraphQl:

架构1:

type Query {
  bookById(id: ID): Book
}

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

type Author {
  id: ID
  firstName: String
  lastName: String
}
Run Code Online (Sandbox Code Playgroud)

模式2:

type Query {
  personByName(name: String): Person
}

type Person {
  id: ID
  firstName: String
  lastName: String
}
Run Code Online (Sandbox Code Playgroud)

Spring-GraphQL 似乎将它们合并到一个 GraphQL 模式文件中,并且 Spring-Boot Graphql 应用程序的启动以以下错误结束:

引起原因:graphql.schema.idl.errors.SchemaProblem:errors=['Query'类型[@1:1]尝试重新定义现有的'Query'类型[@1:1]]

当我将其更改为:

架构1:

type Query {
  bookById(id: ID): Book
  personByName(name: String): Person
}
Run Code Online (Sandbox Code Playgroud)

模式2:

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

type Author {
  id: ID
  firstName: String
  lastName: String
}

type Person {
  id: ID
  firstName: String
  lastName: String
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,我可以使用 graphiql 调用这两个查询。graphql spring 如何与多个模式一起工作?看来 spring-graphql 将文件合并到一个模式中,因此每个文件的多个查询类型会破坏应用程序。

感谢您的回答。

Bri*_*zel 7

Spring GraphQL 正在加载配置位置下的所有模式资源,并使用TypeDefinitionRegistry::merge它们创建单个模式。

我认为重新定义任何类型(甚至是Query一个类型)都应该引发错误,否则这可能会隐藏重要问题和冲突的模式定义。这就是 GraphQL JavaTypeDefinitionRegistry正在做的事情。

您可以像这样组织架构文件:

graphql/schema.graphqls

type Query {

}

// add common directives, scalars, etc

Run Code Online (Sandbox Code Playgroud)

graphql/books.graphqls

extend type Query {
  bookById(id: ID): Book
}

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

type Author {
  id: ID
  firstName: String
  lastName: String
}
Run Code Online (Sandbox Code Playgroud)

graphql/person.graphqls

extend type Query {
  personByName(name: String): Person
}

type Person {
  id: ID
  firstName: String
  lastName: String
}

Run Code Online (Sandbox Code Playgroud)