【问题标题】:Null pointer exception with OutboundSseEvent in a server sent event service服务器发送事件服务中带有 OutboundSseEvent 的空指针异常
【发布时间】:2019-11-08 06:55:19
【问题描述】:

我正在尝试使用 OutboundSseEvent 类在 Java 服务器中设置服务器发送事件。我不确定为什么我的代码不断抛出空指针异常。我使用这些教程作为参考。 https://www.baeldung.com/java-ee-jax-rs-ssehttps://www.programcreek.com/java-api-examples/index.php?api=javax.ws.rs.sse.OutboundSseEvent

@Path("ssetest")
public class SSETestService extends SecureService {

    private Sse sse;

    @GET
    @Path("/test")
    @Produces("text/event-stream")
    public void SSETestService(@Context Sse sse, SseEventSink sseEventSink)
            throws InterruptedException, IllegalArgumentException {
        OutboundSseEvent stringEvent = sse.newEventBuilder()
                .name("ping")
                .data("hello world").build();
        sseEventSink.send(stringEvent);
    }

}

在客户端...

    testSSE() {
      console.log("in testSSE()");
      const evtSource = new EventSource(
        "http://localhost:8081/api/ssetest/test"
      );
      evtSource.onmessage = function(event) {
        console.log("received message");
        console.log("event.data: " + event.data);
      };
      evtSource.addEventListener("ping", function(event) {
        console.log("event.data: " + event.data);
        console.log("received ping event");
      });
      evtSource.onerror = function(err) {
        console.error("EventSource failed:", err);
      };
    }

感谢任何指点。

【问题讨论】:

    标签: java nullpointerexception server-sent-events eventsource


    【解决方案1】:

    实例 sse 为空。对于像试金石这样的测试,你可以打印 sse 来查看。如果你使用 Spring 框架 private Sse sse; 应该自动装配如下

    @Autowired
    private Sse sse;
    

    我认为应该删除参数@Context Sse sse,因为您已经在类中定义了。

    【讨论】:

    • 谢谢。我没有使用 Spring 框架。我更新了我正在关注的指南的链接。 baeldung.com/java-ee-jax-rs-sse>
    【解决方案2】:

    我不确定你的空指针究竟出现在哪里,但在我的情况下,这是因为SseSseEventSink 实例的注入失败。在这种情况下,您的类路径中缺少 SSE 功能的实现。你可以使用:

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-sse</artifactId>
        <version>3.4.5</version>
    </dependency>
    

    此外,您需要通过启用该设置来确保您的 servlet 允许异步通信,例如:

    @WebServlet(... asyncSupported = true, ...)
    ...
    public class MyServlet {
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2014-09-29
      • 1970-01-01
      相关资源
      最近更新 更多