我使用“代码优先”方法使用 graphql-java-annotations 定义架构,而不是在单独的
.graphqls
文件中定义架构。
我尝试使用
GraphQlSourceBuilderCustomizer
指定架构,如文档中提到的,但出现以下异常:
org.springframework.graphql.execution.MissingSchemaException:未配置 GraphQL 架构定义。 在这是我的配置类。有谁知道我哪里错了?
@Configuration
public class GraphQLConfiguration {
@Bean
public GraphQlSourceBuilderCustomizer sourceBuilderCustomizer() {
GraphQLSchema graphQLSchema = AnnotationsSchemaCreator.newAnnotationsSchema()
.query(GraphQLQuery.class)
.build();
return graphQlSourceBuilder -> graphQlSourceBuilder.configureGraphQl(graphQLBuilder -> graphQLBuilder.schema(graphQLSchema));
}
}
这个问题的答案,很明显 Spring-Graphql 需要具有有效架构的 schema.graphqls 文件,否则它将无法加载。
有两种可能的解决方法:
@Bean
@Lazy
@ConditionalOnBean({GraphQLSchema.class, DataFetcherExceptionHandler.class})
public GraphQlSourceBuilderCustomizer federationTransform(GraphQLSchema schema,
DataFetcherExceptionHandler exceptionHandler) {
String ss = """
type Meta {
count: Int
}
type Query {
NotificationsMeta: Meta
}
""";
return builder -> {
URL schemaUrl = InMemoryURLFactory.getInstance().build("/graphql.schema", ss);
builder.schemaResources(new UrlResource(schemaUrl));
builder.configureGraphQl(graphQLBuilder -> graphQLBuilder.schema(schema)
.defaultDataFetcherExceptionHandler(exceptionHandler));
};
}
这样,内存中的模式将被忽略,并使用 GraphQLSchema
对象表示的模式。 注意:InMemoryURLFactory 可以从这个 Stack Overflow 答案 获得