GraphQL - 架构错误:
Posted
技术标签:
【中文标题】GraphQL - 架构错误:【英文标题】:GraphQL - SchemaError: 【发布时间】:2020-11-26 08:59:38 【问题描述】:使用 java 构建微服务 -
spring-boot 版本 2.2.6.RELEASE graphql-spring-boot-starter 版本 5.0.2
尝试使用 graphql 突变在 MongoDB 中持久化记录,我通过如下所示的单个对象成功持久化 -
type ParentElement
id: ID!
type: String
child: String
但是在尝试使用嵌套对象时,我看到以下错误 -
原因:com.coxautodev.graphql.tools.SchemaError:预期类型“ChildElement”是 GraphQLInputType,但它不是!一个类型是否只允许用于错误地用作输入类型的对象类型,反之亦然?
我的架构如下-
schema
query: Query
mutation: Mutation
type ChildElement
make: String
model: String
type ParentElement
id: ID!
type: String
child: ChildElement
type Query
findAllElements: [ParentElement]
type Mutation
createElement(id: String, type: String, child: ChildElement): ParentElement
Pojo Classes & Mutation 如下 -
@Document(collection="custom_element")
public class ParentElement
private String id;
private String type;
private ChildElement child;
public class ChildElement
private String make;
private String model;
@Component
public class ElementMutation implements GraphQLMutationResolver
private ElementRepository elementRepository;
public ElementMutation(ElementRepository elementRepository)
this.elementRepository = elementRepository;
public ParentElement createElement(String id, String type, ChildElement child)
ParentElement element = new ParentElement()
elementRepository.save(element);
return element;
@Component
public class ElementQuery implements GraphQLQueryResolver
private ElementRepository elementRepository;
@Autowired
public ElementQuery(ElementRepository elementRepository)
this.elementRepository = elementRepository;
public Iterable<ParentElement> findAllElements()
return elementRepository.findAll();
@Repository
public interface ElementRepository extends MongoRepository<ParentElement, String>
我想在 mongo db 中保存以下 json 表示 -
"id": "custom_id",
"type": "custom_type",
"child":
"make": "custom_make",
"model": "Toyota V6",
我尝试了几件事,但是在启动服务器时总是遇到同样的异常。上面的json是一个简单的表示。我想保存更复杂的一个,与其他在线示例的不同之处在于,我不想为子元素创建单独的 mongo 对象,如在线提供的 Book-Author 示例所示。
【问题讨论】:
【参考方案1】:Graphql type
和 input
是两个不同的东西。您不能将type
用作突变input
。这正是异常的原因:Expected type 'ChildElement' to be a GraphQLInputType, but it wasn't
,该库期待一个 input
,但发现了其他东西(对象类型)。
要解决这个问题,请创建一个子输入:
input ChildInput
make: String
model: String
type Mutation
createElement(id: String, type: String, child: ChildInput): ParentElement
你也可以看看这个问题:Can you make a graphql type both an input and output type?
【讨论】:
感谢 AlliorionX 提供详细信息。我将其更改为 Input,它对我有用。以上是关于GraphQL - 架构错误:的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL 架构文件应包含有效的 GraphQL 自省查询结果
在 GraphQL 架构中使用泛型对象作为输入类型时出现问题错误:架构必须包含唯一的命名类型
使用 graphql-tools 打印远程模式时出现 getDirectives 错误
importSchema GraphQL 错误:ENOENT:没有这样的文件或目录,打开“./schema.graphql”