【问题标题】:Messing with JAX-RS SSE : Could not find a suitable constructor in javax.ws.rs.sse.SseEventSink class与 JAX-RS SSE 混淆:在 javax.ws.rs.sse.SseEventSink 类中找不到合适的构造函数
【发布时间】: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 它工作!神奇!太棒了

标签: java jersey jax-rs


【解决方案1】:

我遇到了同样的问题,并通过将 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接口提供了一个默认实现和一个默认映射器

【讨论】:

  • 谢谢!刚试了一下,好像没用,好像报了同样的错误。也让我感到厌烦的是,在所有关于使用 SSE 的教程中,没有一个真正提到使用 SseEventSink 的实现。或者在他们的 github 示例中包含任何类似的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2020-10-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多