首页 > 解决方案 > GraphQL:无法匹配类型定义(TypeName{name='Long'})

问题描述

我只是在使用 Springboot 学习 graphql,并且正在尝试此链接https://bezkoder.com/spring-boot-graphql-mysql-jpa/中的示例。现在我遇到了一个问题,无法理解它为什么会抛出这个错误。

有人可以帮我指出我犯了什么错误吗?

错误: graphql.kickstart.tools.SchemaClassScannerError: Unable to match type definition (TypeName{name='Long'}) with java type (class java.lang.Long): No TypeDefinition for type name Long

作者.graphqls

type Author {
    id: ID!
    name: String!
    age: Int
}

# Root
type Query {
    findAuthorById(id: Long): Author!
    findAllAuthors: [Author]!
    countAuthors: Long!
}

# Root
type Mutation {
    createAuthor(name: String!, age: Int): Author!
}

作者.java

@Entity
public class Author {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @Column(name = "name", nullable = false)
  private String name;

  @Column(name = "age")
  private Integer age;

标签: javaspring-bootgraphql

解决方案


GraphQL 规范仅将 Int、Float、String、Boolean 和 ID 指定为原始类型(也称为“标量”)。但是,它确实允许扩展这组标量类型。您正在使用的 GraphQL 规范的实现,GraphQL Java,默认情况下不提供Long标量类型。您可以设置自己的,但在这种情况下,我认为使用graphql-java-extended-scalars包会更容易。这很容易设置。请注意,它提供了一个GraphQLLong标量类型 def,它表示java.lang.Long. 如果您不想为此类型使用名称“GraphQLLong”,您可以像这样给它起别名:

GraphQLScalarType longScalar =
            ExtendedScalars.newAliasedScalar('Long')
                .aliasedScalar(ExtendedScalars.GraphQLLong)
                .build() 

请参阅 graphql-java-extended-scalars 的文档,并深入研究源代码以了解它们如何设置标量。


推荐阅读