此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

GraphQL 支持

Spring Integration提供了用于与GraphQL协议交互的通道适配器。 该实现基于 Spring for GraphQLspring-doc.cadn.net.cn

项目需要此依赖项:spring-doc.cadn.net.cn

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-graphql</artifactId>
    <version>7.0.0-SNAPSHOT</version>
</dependency>
compile "org.springframework.integration:spring-integration-graphql:7.0.0-SNAPSHOT"

GraphQL 出站网关

GraphQlMessageHandler是一个AbstractReplyProducingMessageHandler扩展,表示用于执行 GraphQL 的出站网关协定query,mutationsubscription作并产生其结果。 它需要一个org.springframework.graphql.ExecutionGraphQlService执行operation,可以静态配置,也可以通过针对请求消息的 SpEL 表达式进行配置。 这operationName是可选的,也可以静态配置或通过 SpEL 表达式进行配置。 这variablesExpression也是可选的,用于参数化作。 这locale是可选的,用于 GraphQL Java 库中的作执行上下文。 这executionId可以通过 SpEL 表达式进行配置,默认为id请求消息的标头。spring-doc.cadn.net.cn

如果请求消息的有效负载是ExecutionGraphQlRequest,则不会在GraphQlMessageHandler并且这样的输入按原样用于ExecutionGraphQlService.execute(). 否则,operation,operationName,variablesexecutionId使用上述 SpEL 表达式根据请求消息确定。spring-doc.cadn.net.cn

GraphQlMessageHandler是一个响应式流组件,并生成一个Mono<ExecutionGraphQlResponse>回复ExecutionGraphQlService.execute(ExecutionGraphQlRequest). 这样的Mono由框架在ReactiveStreamsSubscribableChannel输出通道或在AbstractMessageProducingHandler当输出通道不响应时异步。 请参阅文档ExecutionGraphQlResponse如何处理 GraphQL作结果。spring-doc.cadn.net.cn

@Bean
GraphQlMessageHandlerSpec graphQlMessageHandlerSpec(ExecutionGraphQlService graphQlService) {
    return GraphQl.gateway(graphQlService)
            .operation("""
                    query HeroNameAndFriends($episode: Episode) {
                      hero(episode: $episode) {
                        name
                        friends {
                          name
                        }
                      }
                    }""")
            .variablesExpression("{episode:'JEDI'}");
}

@Bean
IntegrationFlow graphqlQueryMessageHandlerFlow(GraphQlMessageHandler handler) {
    return IntegrationFlow.from(MessageChannels.flux("inputChannel"))
            .handle(handler)
            .channel(c -> c.flux("resultChannel"))
            .get();
}

@Bean
ExecutionGraphQlService graphQlService(GraphQlSource graphQlSource) {
    return new DefaultExecutionGraphQlService(graphQlSource);
}

@Bean
GraphQlSource graphQlSource(AnnotatedControllerConfigurer annotatedDataFetcherConfigurer) {
    return GraphQlSource.builder()
            .schemaResources(new ClassPathResource("graphql/test-schema.graphqls"))
            .configureRuntimeWiring(annotatedDataFetcherConfigurer)
            .build();
}

@Bean
AnnotatedControllerConfigurer annotatedDataFetcherConfigurer() {
    return new AnnotatedControllerConfigurer();
}

订阅作的结果应适用特殊处理。 在本例中,ExecutionGraphQlResponse.getData()返回一个SubscriptionPublisher必须手动订阅和处理。 或者,可以通过普通服务激活器将其平面映射到FluxMessageChannel:spring-doc.cadn.net.cn

@ServiceActivator(inputChannel = "graphQlResultChannel", outputChannel="graphQlSubscriptionChannel")
public SubscriptionPublisher obtainSubscriptionResult(ExecutionGraphQlResponse graphQlResponse) {
	return graphQlResponse.getData();
}

此类出站网关不仅可用于通过 HTTP 的 GraphQL 请求,还可用于在消息中生成或携带 GraphQL作或其参数的任何上游端点。 结果GraphQlMessageHandler处理可以作为对上游请求的回复生成,也可以发送到下游以在集成流中进行进一步处理。spring-doc.cadn.net.cn