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 typeinput 是两个不同的东西。您不能将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 突变类型名错误

使用 graphql-tools 打印远程模式时出现 getDirectives 错误

importSchema GraphQL 错误:ENOENT:没有这样的文件或目录,打开“./schema.graphql”

无法解析自定义对象 graphql 架构