【发布时间】:2018-11-22 23:55:37
【问题描述】:
我目前正在尝试使用 SSE 进行网络项目。我必须更新并启用异步支持。但是,对“订阅”端点的简单“GET”请求会引发错误,即使使用浏览器完成也是如此。
@Path("/subscribe")
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void subscribe(@Context SseEventSink eSink) {
sinkList.add(eSink);
}
如果我只是通过浏览器输入请求,这是不正确的吗?这是兼容性问题吗?与具有客户端的 websocket 相比,我还如何测试 SSE 连接?到目前为止,我知道无法使用构造函数创建 SseEventSinks。我对此有点过头了
任何帮助将不胜感激!
谢谢
下面抛出的汇总错误/警告日志。
警告:已检测到以下警告:警告:HK2 [javax.ws.rs.sse.SseEventSink] 的服务具体化失败,带有 异常:MultiException 堆栈 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 堆栈 2 of 2 java.lang.IllegalArgumentException:发现错误,而 物化 SystemDescriptor( 实现=javax.ws.rs.sse.SseEventSink 合同={javax.ws.rs.sse.SseEventSink} 范围=org.glassfish.jersey.process.internal.RequestScoped 限定符={} 描述符类型=类描述符可见性=正常 元数据= rank=0 loader=null proxiable=null proxyForSameScope=null analysisName=null id=198 locatorId=0 identityHashCode=282776705 reified=false) 在 org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:705) 在 org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:464)
...
警告:HK2 服务具体化失败 [javax.ws.rs.sse.SseEventSink] 有一个异常:MultiException 堆栈 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 堆栈 2 of 2 java.lang.IllegalArgumentException:发现错误,而 物化 SystemDescriptor( 实现=javax.ws.rs.sse.SseEventSink 合同={javax.ws.rs.sse.SseEventSink} scope=org.glassfish.jersey.process.internal.RequestScoped
...
严重:Servlet.service() for servlet [Jersey Web Application] in 带有路径 [/Api] 的上下文引发异常 [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) 在 java.lang.Thread.run(Thread.java:748)
【问题讨论】:
-
SseEventSink是一个接口,你可能需要使用一个实现来代替 -
看起来是这样,唯一让我失望的是,教程实现似乎都没有提到应用 SSE 的那一步。我觉得我正在使用不同的 JAX-RS 或其他东西?即:baeldung.com/java-ee-jax-rs-sse
-
我实际上是在准备面试时看的,我意识到我的回答是假的。事实上,我和你有同样的问题。如果我找到如何让它工作,我会暂时删除我的答案并发布另一个答案。
-
我用对我有用的方法更新了我的答案。缺少依赖项
-
@Bentaye 它工作!神奇!太棒了