迷惑JAX-RS SSE:在javax.ws.rs.sse.SseEventSink类

时间:2018-11-22 23:55:37

标签: java jersey jax-rs

我目前正在尝试在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)

1 个答案:

答案 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接口提供了默认实现和默认映射器