【发布时间】:2021-02-25 19:41:18
【问题描述】:
我正在尝试同时使用两个库,GraphQL 和 Jmix。
我使用 Intellij 的新项目向导(安装了 Jmix 插件)创建了 Jmix 项目,然后使用标准的 graphql-spring-boot-starter 将 GraphQL 添加到 Gradle。然后我写了一个模式和解析器 bean。
但是在启动过程中,由于 WebSocket 端点 /subscriptions 在 Tomcat 上注册了两次,因此引发了异常。 (我尝试使用应用程序属性 graphql.servlet.subscriptions.websocket.path 更改端点,但这不是问题。)
经过一番挖掘,我发现 graphql-spring-boot-autoconfigure 中的 GraphQLWebsocketAutoConfiguration 类和 jmix-ui-starter 中的 VaadinAutoConfiguration 都注册了一个 ServerEndpointExporter bean,这是不应该发生的。
这是graphql的代码:
@Bean
@ConditionalOnMissingBean
@ConditionalOnClass(ServerContainer.class)
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
这里是 Jmix 的:
@Bean
public ServerEndpointExporter websocketEndpointDeployer() {
return new VaadinWebsocketEndpointExporter();
}
GraphQL 被标记为 ConditionalOnMissingBean,但在另一个之前注册,因此不会触发条件。
如何禁用这两个 bean 之一,或设置它们的优先级?
我设法通过完全禁用 GraphQL 的 websocket 服务来解决这个问题:
graphql.servlet.websocket.enabled = false
但我想知道一般如何解决这类问题。
【问题讨论】:
-
能否请您提供指向该问题的 GraphQLWebAutoConfiguration 和 VaadinAutoConfiguration 的源代码的链接?
-
@MarkBramnik 我已经更新了库(我没有使用最新版本)并添加了链接。
-
谢谢,请看我的回答。我知道这听起来像是解决方法,但在这种情况下,这是我能建议的最好的方法......
标签: spring spring-boot dependency-injection