spring-webflux - "error": "无法连接到 websocket 端点 ws://localhost:8000/subscriptions。请检查端点 url 是否正确。" 对于graphql spqr
问题描述
我将数据存储在 mongodb 中,我正在尝试使用 graphql spqr 和项目响应式来实现订阅。当我尝试测试突变和查询时,我得到了回应,但我不断收到以下错误消息:
{ "error": "无法连接到 websocket 端点 ws://localhost:8080/subscriptions。请检查端点 url 是否正确。" }
我已经对这个问题进行了一些研究并遇到了这个问题,包括我的依赖项中的“spring-boot-starter-websocket”并没有解决这个问题,而且我没有使用 firefox 作为我的游乐场 gui 浏览器。
我按照这个示例介绍了如何使用 graphql spqr 实现订阅,当我尝试克隆项目时,订阅实际上工作得很好。
我的实现与上面的项目没有任何区别......这是我的 build.gradle 文件:
configurations {
compile.exclude module: 'spring-boot-starter-tomcat'
compile.exclude group: 'org.apache.tomcat'
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
// https://mvnrepository.com/artifact/de.flapdoodle.embed/de.flapdoodle.embed.mongo
testImplementation group: 'de.flapdoodle.embed', name: 'de.flapdoodle.embed.mongo', version: '3.0.0'
// https://mvnrepository.com/artifact/io.leangen.graphql/graphql-spqr-spring-boot-starter
implementation group: 'io.leangen.graphql', name: 'graphql-spqr-spring-boot-starter', version: '0.0.6'
implementation group: 'io.leangen.graphql', name: 'spqr', version: io_leangen_graphql_spqr
// https://mvnrepository.com/artifact/com.graphql-java-kickstart/playground-spring-boot-starter
implementation group: 'com.graphql-java-kickstart', name: 'playground-spring-boot-starter', version: '11.1.0'
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-websocket', version: '2.5.4'
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb-reactive
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb-reactive', version: '2.5.4'
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.5.4'
compileOnly group: 'org.projectlombok', name: 'lombok', version: org_projectlombok_lombok_version
annotationProcessor group: 'org.projectlombok', name: 'lombok', version: org_projectlombok_lombok_version
}
我在用着
compile.exclude module: 'spring-boot-starter-tomcat'
compile.exclude group: 'org.apache.tomcat'
启动netty而不是tomcat
这是我的订阅实现:
@Autowired
private ProductRepository productRepository;
private final ConcurrentMultiMap<Double, FluxSink<ProductDto>> subscribers = new ConcurrentMultiMap<>();
@GraphQLQuery
public Flux<ProductDto> getProducts(){
return productRepository.findAll().map(AppUtils::ProductEntityToDto);
}
@GraphQLSubscription
public Publisher<ProductDto> taskStatusChanged(double price) {
return Flux.create(subscriber -> subscribers.add(price, subscriber.onDispose(() -> subscribers.remove(price, subscriber))), FluxSink.OverflowStrategy.LATEST);
}
我的代码中是否缺少某些内容?还是依赖?还是其他配置?任何帮助将不胜感激...
解决方案
默认情况下,似乎 GraphQl SPQR 将 WebSocket 订阅处理端点映射到/graphql
,而不是其他 GraphQL 框架中的通用/subscriptions。
应用程序启动时,请在控制台中查看以下信息。
2021-10-09 12:50:02.653 DEBUG 14632 --- [ Test worker] o.s.w.s.s.s.WebSocketHandlerMapping : Patterns [/graphql] in 'webSocketHandlerMapping'
可以通过在application.propertiesgraphql.spqr.ws.endpoint
中自定义属性来更改它。
但它的 GraphQL WebSocket 订阅实现似乎很混乱,它没有遵循 Appllo WebSocket 订阅协议或新graphql-ws
规范。
推荐阅读
- html - 如何更改导航栏中活动下拉菜单的颜色
- java - 如何使用 wsimpot 命令创建 SOAP Web 服务存根
- java - 在 Spring 的循环中监控作业状态
- r - memory.limit() 坏了吗?
- python - 是否有一个函数可以帮助我将 (x) 拆分为一个字符串,每个拆分都包含第 (x+1) 个值?
- java - 如何在异步任务的 for 循环中更新列表视图
- android - windowBackground 上的居中图像与膨胀布局上的图像不同
- python - 无法从 __init__ 导入属性
- python - 施加约束时问题不遵循 DCP 规则
- mysql - 为什么 Google Cloud SQL 中的 COUNT 有时会这么慢?