java - 与 JAX-RS SSE 混淆:在 javax.ws.rs.sse.SseEventSink 类中找不到合适的构造函数
问题描述
我目前正在尝试使用 SSE 进行网络项目。我必须更新并启用异步支持。但是,对“订阅”端点的简单“GET”请求会引发错误,即使使用浏览器完成也是如此。
@Path("/subscribe")
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void subscribe(@Context SseEventSink eSink) {
sinkList.add(eSink);
}
如果我只是用浏览器输入请求,这是不正确的吗?这是兼容性问题吗?与具有客户端的 websocket 相比,我还如何测试 SSE 连接?到目前为止,我知道无法使用构造函数创建 SseEventSinks。我对此有点过头了
任何帮助将不胜感激!
谢谢
下面抛出的汇总错误/警告日志。
警告:已检测到以下警告:警告:[javax.ws.rs.sse.SseEventSink] 的 HK2 服务具体化失败,出现异常:MultiException stack 1 of 2 java.lang.NoSuchMethodException:在 javax 中找不到合适的构造函数.ws.rs.sse.SseEventSink 类。在 org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192) 在 org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:180) 在 org.jvnet.hk2.internal.ClazzCreator .initialize(ClazzCreator.java:129)
...
在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:748) MultiException stack 2 of 2 java.lang.IllegalArgumentException: 错误在具体化 SystemDescriptor 时发现( implementation=javax.ws.rs.sse.SseEventSink contract={javax.ws.rs.sse.SseEventSink} scope=org.glassfish.jersey.process.internal.RequestScoped qualifiers={} descriptorType=CLASS org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java: 705) 在 org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:464)
...
警告:[javax.ws.rs.sse.SseEventSink] 的 HK2 服务具体化失败,出现异常:MultiException stack 1 of 2 java.lang.NoSuchMethodException:在 javax.ws.rs.sse.SseEventSink 类中找不到合适的构造函数. 在 org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192) 在 org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:180) 在 org.jvnet.hk2.internal.ClazzCreator .initialize(ClazzCreator.java:129)
...
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run (Thread.java:748)MultiException stack 2 of 2 java.lang.IllegalArgumentException:在具体化 SystemDescriptor 时发现错误( implementation=javax.ws.rs.sse.SseEventSinkcontracts={javax.ws.rs.sse.SseEventSink} 范围=org.glassfish.jersey.process.internal.RequestScoped
...
严重:servlet [Jersey Web Application] 在路径 [/Api] 的上下文中的 Servlet.service() 引发异常 [java.lang.IllegalArgumentException:检测到 SseEventSink 参数,但未找到。] 根本原因 java.lang.IllegalArgumentException:SseEventSink检测到参数,但未找到。在 org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$SseEventSinkInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:159) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
...在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 org.apache.tomcat.util.threads。 TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
解决方案
我遇到了同样的问题,并通过将jersey-media-sse依赖项添加到我的 pom.xml 中(使用 Maven)使其工作
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-sse -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-sse</artifactId>
<version>2.27</version>
</dependency>
如果您不使用 Maven,这里是repo 的链接
我不确定,但据我了解,问题在于这SseEventSink
是一个接口,Jersey 无法为它实例化任何类。SseEventSink
上面的依赖可能为接口提供了一个默认实现和一个默认映射器
推荐阅读
- python - 无法访问属于同一类的其他函数的函数中的变量?
- java - JavaFx WebView 和 JxBrowser 替代品
- python - tf.keras OOM 即使在批量大小为 1 的小型 LSTM 模型上
- docker - 如何在服务器上自动部署和运行 docker 镜像?
- java - Google App Engine 项目未在 Eclipse 中启动
- ios - iOS 中 MVVM 的正确流程是什么?
- javascript - 删除数组内的空数组的问题
- python - TypeError:使用 Pandas 解析 CSV 时无法理解数据类型
- java - Java中赋值时浮点值的变化
- swift - 使用 SwiftUI 将 TextField 限制为 x 个字符