【问题标题】:GraphQL Java Kickstart Tools Enums causing exception - Expected enum with name 'XXX' but found noneGraphQL Java Kickstart 工具枚举导致异常 - 预期枚举名称为“XXX”,但没有找到
【发布时间】:2022-02-17 06:47:49
【问题描述】:

在将 kickstart 框架与 spring 一起使用时,如何在 GraphQL 中正确注册 Java 枚举?

在简单的 Java Spring 应用程序中尝试使用具有等效 Java 枚举的 GraphQL 模式枚举时,会引发以下异常:

Caused by: graphql.kickstart.tools.SchemaError: Expected enum with name 'CarType' but found none!
at graphql.kickstart.tools.SchemaParser.createEnumObject(SchemaParser.kt:191)
at graphql.kickstart.tools.SchemaParser.parseSchemaObjects(SchemaParser.kt:85)
at graphql.kickstart.tools.SchemaParser.makeExecutableSchema(SchemaParser.kt:112)
at graphql.kickstart.tools.boot.GraphQLJavaToolsAutoConfiguration.graphQLSchema(GraphQLJavaToolsAutoConfiguration.java:147)
at graphql.kickstart.tools.boot.GraphQLJavaToolsAutoConfiguration$$EnhancerBySpringCGLIB$$1b4eddf2.CGLIB$graphQLSchema$1(<generated>)

Java端枚举类是如何注册的?我已经看到了 RuntimeWiring 的示例并通过它注册它们,但是模式创建是为我的使用自动完成的,所以我找不到实现这一点的方法(或正确的钩子)。

GraphQL 架构是:

extend type Query {
    cars : [Car]
}

type Car {
    type : CarType
}

enum CarType {
    AUDI,
    BMW,
    VOLKSWAGEN
}

还有 Java 枚举:

public enum CarType {
    AUDI, BMW, VOLKSWAGEN
}

【问题讨论】:

    标签: java graphql graphql-java-tools


    【解决方案1】:

    所以在我没有发布的代码中,我故意使用 HashMap 而不是 Dto pojo 类,其中枚举驻留在里面:

    public class CarsResolver implements GraphQLQueryResolver {
        public Collection<HashMap> cars() {
            return emptyList();
        }
    }
    

    这意味着(我认为)集合中的类从未被框架遍历以自动神奇地为枚举创建解析器...这导致了上述异常。

    我故意使用 HashMap 的原因(顺便说一下)是为了避免通用 graphql 网关了解我们更广泛系统中的 Dto 类型。我现在正在重新考虑这个决定:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多