我目前正在尝试在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]的服务验证失败,带有 异常:2的MultiException堆栈1 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之2 java.lang.IllegalArgumentException:时发现错误 调整SystemDescriptor( 实现= javax.ws.rs.sse.SseEventSink 合同= {javax.ws.rs.sse.SseEventSink} scope = org.glassfish.jersey.process.internal.RequestScoped 限定符= {}说明符类型= CLASS说明符可见性=正常 元数据=等级= 0加载程序=空可代理=空 proxyForSameScope =无效analysisName =无效id = 198 locatorId = 0 identityHashCode = 282776705已验证=假)为 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 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堆栈2之2 java.lang.IllegalArgumentException:时发现错误 调整SystemDescriptor( 实现= javax.ws.rs.sse.SseEventSink 合同= {javax.ws.rs.sse.SseEventSink} scope = org.glassfish.jersey.process.internal.RequestScoped
...
严重:Servlet [Jersey Web应用程序]中的Servlet.service() 路径[/ 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)
答案 0 :(得分:2)
我遇到了同样的问题,并通过将 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,这里为the link to the repo
我不确定,但是据我了解,问题在于SseEventSink
是一个接口,Jersey无法为其实例化任何类。上面的依赖项可能为SseEventSink
接口提供了默认实现和默认映射器