GraphQL 支持
GraphQL 支持
Spring 集成提供了用于与 GraphQL 协议交互的通道适配器。 该实现基于 Spring for GraphQL。
您需要将此依赖项包含在您的项目中:
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-graphql</artifactId>
<version>6.0.9</version>
</dependency>
compile "org.springframework.integration:spring-integration-graphql:6.0.9"
GraphQL 出站网关
这GraphQlMessageHandler
是一个AbstractReplyProducingMessageHandler
表示用于执行 GraphQL 的出站网关协定的扩展query
,mutation
或subscription
作并产生他们的结果。
它需要一个org.springframework.graphql.ExecutionGraphQlService
执行operation
,可以静态配置,也可以通过 SpEL 表达式针对请求消息进行配置。
这operationName
是可选的,也可以静态或通过 SPEL 表达式进行配置。
这variablesExpression
也是可选的,用于参数化作。
这locale
是可选的,用于 GraphQL Java 库中的作执行上下文。
这executionId
可以通过 SpEL 表达式进行配置,默认为id
标头。
如果请求消息的有效负载是ExecutionGraphQlRequest
,则不会在GraphQlMessageHandler
并且这样的输入将按原样用于ExecutionGraphQlService.execute()
.
否则,operation
,operationName
,variables
和executionId
使用上述 SPEL 表达式根据请求消息确定。
这GraphQlMessageHandler
是一个反应式流组件,并生成一个Mono<ExecutionGraphQlResponse>
reply 作为ExecutionGraphQlService.execute(ExecutionGraphQlRequest)
.
这样的Mono
由ReactiveStreamsSubscribableChannel
output channel 或AbstractMessageProducingHandler
当 output channel 不是 reactive 时异步的。
请参阅ExecutionGraphQlResponse
如何处理 GraphQL作结果。
@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();
}
应对订阅作的结果进行特殊处理。
在这种情况下,RequestOutput.getData()
返回SubscriptionPublisher
必须手动订阅和处理。
或者,它可以通过普通服务激活器平面映射到FluxMessageChannel
:
@ServiceActivator(inputChannel = "graphQlResultChannel", outputChannel="graphQlSubscriptionChannel")
public SubscriptionPublisher obtainSubscriptionResult(RequestOutput output) {
return output.getData(0);
}
此类出站网关不仅可以用于通过 HTTP 的 GraphQL 请求,还可以用于生成或携带 GraphQL作或其消息中的参数的任何上游终端节点。
结果GraphQlMessageHandler
handling 可以作为对上游请求的回复生成,也可以发送到下游以在集成流中进一步处理。