首页 > 解决方案 > 与 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)

标签: javajerseyjax-rs

解决方案


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


推荐阅读