0

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

在尝试在简单的 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
}
4

1 回答 1

0

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

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

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

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

于 2022-02-16T22:47:49.597 回答