Работа с SSE JAX-RS: не удалось найти подходящий конструктор в классе javax.ws.rs.sse.SseEventSink - PullRequest
0 голосов
/ 23 ноября 2018

Я сейчас пытаюсь поэкспериментировать в веб-проекте с SSE.Мне пришлось обновить и включить асинхронную поддержку.Однако простой запрос GET к конечной точке подписки выдает ошибку, даже если это делается с помощью браузера.

@Path("/subscribe")
@GET
@Produces(MediaType.SERVER_SENT_EVENTS)
public void subscribe(@Context SseEventSink eSink) {
    sinkList.add(eSink);
}

Если я просто ввожу запрос через браузер, это неправильно?Это проблема совместимости?как еще я могу проверить соединения SSE по сравнению с веб-сокетами, у которых есть клиент?Пока я знаю, что SseEventSinks не может быть создан с помощью конструктора.Я немного над головой с этим

Любая помощь будет принята с благодарностью!

Спасибо

Обобщенные журналы ошибок / предупреждений, показанные ниже.

ПРЕДУПРЕЖДЕНИЕ: Обнаружены следующие предупреждения: ПРЕДУПРЕЖДЕНИЕ: не удалось выполнить преобразование службы HK2 для [javax.ws.rs.sse.SseEventSink] с исключением: стек MultiException 1 из 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.internalor.Claz.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 qualifiers = {} descriptorType = CLASS descriptorVisibility = NORMAL метаданные = rank = 0 loader = null proxiable = null proxyForSameScope = null analysisName = null id = 0 id = null id = 198 locidentityHashCode = 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 из 2java.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.internalor.Claz.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

...

SEVERE: 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.mode.jisishoser.jerD_RD*

... на 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 голосов
/ 23 ноября 2018

У меня возникла та же проблема, и она заработала, добавив зависимость 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 здесь ссылка на репо

Я не уверен, но, насколько я понимаю, проблема в том, что SseEventSink - это интерфейс, и Джерси не может создать экземпляр какого-либо классадля этого.Приведенная выше зависимость, вероятно, обеспечивает реализацию по умолчанию и отображение по умолчанию для интерфейса SseEventSink

...