搞乱 JAX-RS SSE:无法在 javax.ws.rs.sse.SseEventSink class 中找到合适的构造函数
Messing with JAX-RS SSE : Could not find a suitable constructor in javax.ws.rs.sse.SseEventSink class
我目前正在尝试使用 SSE 在网络项目中进行实验。我必须更新并启用异步支持。但是,对 'subscribe' 端点的简单 'GET' 请求会引发错误,即使是通过浏览器完成的。
@Path("/subscribe")
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void subscribe(@Context SseEventSink eSink) {
sinkList.add(eSink);
}
如果我只是用浏览器输入请求,这是不正确的吗?这是兼容性问题吗?与具有客户端的 websockets 相比,我还能如何测试 SSE 连接?到目前为止,我知道不能使用构造函数创建 SseEventSinks。我对此有点不知所措
如有任何帮助,我们将不胜感激!
谢谢
汇总了下面抛出的 error/warning 条日志。
WARNING: The following warnings have been detected: WARNING: HK2
service reification failed for [javax.ws.rs.sse.SseEventSink] with an
exception: MultiException stack 1 of 2
java.lang.NoSuchMethodException: Could not find a suitable constructor
in javax.ws.rs.sse.SseEventSink class. at
org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192)
at
org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:180)
at
org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:129)
...
at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748) MultiException stack 2 of 2
java.lang.IllegalArgumentException: Errors were discovered while
reifying SystemDescriptor(
implementation=javax.ws.rs.sse.SseEventSink
contracts={javax.ws.rs.sse.SseEventSink}
scope=org.glassfish.jersey.process.internal.RequestScoped
qualifiers={} descriptorType=CLASS descriptorVisibility=NORMAL
metadata= rank=0 loader=null proxiable=null
proxyForSameScope=null analysisName=null id=198 locatorId=0
identityHashCode=282776705 reified=false) at
org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:705)
at
org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:464)
...
WARNING: HK2 service reification failed for
[javax.ws.rs.sse.SseEventSink] with an exception: MultiException stack
1 of 2 java.lang.NoSuchMethodException: Could not find a suitable
constructor in javax.ws.rs.sse.SseEventSink class. at
org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192)
at
org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:180)
at
org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:129)
...
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748) MultiException stack 2 of 2
java.lang.IllegalArgumentException: Errors were discovered while
reifying SystemDescriptor(
implementation=javax.ws.rs.sse.SseEventSink
contracts={javax.ws.rs.sse.SseEventSink}
scope=org.glassfish.jersey.process.internal.RequestScoped
...
SEVERE: Servlet.service() for servlet [Jersey Web Application] in
context with path [/Api] threw exception
[java.lang.IllegalArgumentException: SseEventSink parameter detected,
but not found.] with root cause java.lang.IllegalArgumentException:
SseEventSink parameter detected, but not found. at
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$SseEventSinkInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:159)
at
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
... at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
我遇到了同样的问题,通过将 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 无法为它实例化任何 class。上面的依赖项可能为 SseEventSink
接口
提供了默认实现和默认映射器
我目前正在尝试使用 SSE 在网络项目中进行实验。我必须更新并启用异步支持。但是,对 'subscribe' 端点的简单 'GET' 请求会引发错误,即使是通过浏览器完成的。
@Path("/subscribe")
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void subscribe(@Context SseEventSink eSink) {
sinkList.add(eSink);
}
如果我只是用浏览器输入请求,这是不正确的吗?这是兼容性问题吗?与具有客户端的 websockets 相比,我还能如何测试 SSE 连接?到目前为止,我知道不能使用构造函数创建 SseEventSinks。我对此有点不知所措
如有任何帮助,我们将不胜感激!
谢谢
汇总了下面抛出的 error/warning 条日志。
WARNING: The following warnings have been detected: WARNING: HK2 service reification failed for [javax.ws.rs.sse.SseEventSink] with an exception: MultiException stack 1 of 2 java.lang.NoSuchMethodException: Could not find a suitable constructor in javax.ws.rs.sse.SseEventSink class. at org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192) at org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:180) at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:129)
...
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) MultiException stack 2 of 2 java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor( implementation=javax.ws.rs.sse.SseEventSink contracts={javax.ws.rs.sse.SseEventSink} scope=org.glassfish.jersey.process.internal.RequestScoped qualifiers={} descriptorType=CLASS descriptorVisibility=NORMAL metadata= rank=0 loader=null proxiable=null proxyForSameScope=null analysisName=null id=198 locatorId=0 identityHashCode=282776705 reified=false) at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:705) at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:464)
...
WARNING: HK2 service reification failed for [javax.ws.rs.sse.SseEventSink] with an exception: MultiException stack 1 of 2 java.lang.NoSuchMethodException: Could not find a suitable constructor in javax.ws.rs.sse.SseEventSink class. at org.glassfish.jersey.inject.hk2.JerseyClassAnalyzer.getConstructor(JerseyClassAnalyzer.java:192) at org.jvnet.hk2.internal.Utilities.getConstructor(Utilities.java:180) at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:129)
...
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) MultiException stack 2 of 2 java.lang.IllegalArgumentException: Errors were discovered while reifying SystemDescriptor( implementation=javax.ws.rs.sse.SseEventSink contracts={javax.ws.rs.sse.SseEventSink} scope=org.glassfish.jersey.process.internal.RequestScoped
...
SEVERE: Servlet.service() for servlet [Jersey Web Application] in context with path [/Api] threw exception [java.lang.IllegalArgumentException: SseEventSink parameter detected, but not found.] with root cause java.lang.IllegalArgumentException: SseEventSink parameter detected, but not found. at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$SseEventSinkInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:159) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
... at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748)
我遇到了同样的问题,通过将 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 无法为它实例化任何 class。上面的依赖项可能为 SseEventSink
接口