Java Glassfish 4.1上Jersey过滤器中ChunkeOutput/OutputBuffer中的SSE nullpointer

Java Glassfish 4.1上Jersey过滤器中ChunkeOutput/OutputBuffer中的SSE nullpointer,java,glassfish,jersey,server-sent-events,Java,Glassfish,Jersey,Server Sent Events,我有一个问题(?)是从我通过@ApplicationPath将jersey(2.19)从无描述符部署切换到现有JAX-RS web应用程序中的Servlet2.x过滤器时开始的。 我一做完就不工作了。因为当时我正在使用SSE广播机,所以我构建了一个更简单的测试方法,因为我没有得到广播机的任何异常 最后出现了异常: Severe: java.lang.NullPointerException at org.apache.catalina.connector.OutputBuffer.write

我有一个问题(?)是从我通过@ApplicationPath将jersey(2.19)从无描述符部署切换到现有JAX-RS web应用程序中的Servlet2.x过滤器时开始的。 我一做完就不工作了。因为当时我正在使用SSE广播机,所以我构建了一个更简单的测试方法,因为我没有得到广播机的任何异常

最后出现了异常:

Severe:   java.lang.NullPointerException
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:350)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:342)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:161)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:150)
at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.write(ResponseWriter.java:293)
at org.glassfish.jersey.message.internal.CommittingOutputStream.write(CommittingOutputStream.java:214)
at org.glassfish.jersey.media.sse.OutboundEventWriter.writeTo(OutboundEventWriter.java:100)
at org.glassfish.jersey.media.sse.OutboundEventWriter.writeTo(OutboundEventWriter.java:63)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:263)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)
at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:219)
at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:190)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:242)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:347)
at org.glassfish.jersey.server.ChunkedOutput.flushQueue(ChunkedOutput.java:190)
at org.glassfish.jersey.server.ChunkedOutput.write(ChunkedOutput.java:180)
at ch.company.app.controller.MyController$1.run(MyController.java:62)
at java.lang.Thread.run(Thread.java:745)
我使用的代码是泽西岛官方文档的变体:

如果我只使用
eventBuilder.data(…)
,而不使用
name()、id()、comment()
,则例外情况(如建议的)会发生轻微变化:

Severe:   java.lang.NullPointerException
at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:350)
at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:342)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:161)
at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:150)
at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.write(ResponseWriter.java:293)
at org.glassfish.jersey.message.internal.CommittingOutputStream.write(CommittingOutputStream.java:214)
at org.glassfish.jersey.media.sse.OutboundEventWriter$1.write(OutboundEventWriter.java:141)
at java.io.OutputStream.write(OutputStream.java:116)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.io.BufferedWriter.flush(BufferedWriter.java:254)
at org.glassfish.jersey.message.internal.ReaderWriter.writeToAsString(ReaderWriter.java:192)
at org.glassfish.jersey.message.internal.AbstractMessageReaderWriterProvider.writeToAsString(AbstractMessageReaderWriterProvider.java:129)
at org.glassfish.jersey.message.internal.StringMessageProvider.writeTo(StringMessageProvider.java:99)
at org.glassfish.jersey.message.internal.StringMessageProvider.writeTo(StringMessageProvider.java:59)
at org.glassfish.jersey.media.sse.OutboundEventWriter.writeTo(OutboundEventWriter.java:127)
at org.glassfish.jersey.media.sse.OutboundEventWriter.writeTo(OutboundEventWriter.java:63)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:263)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1154)
at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:219)
at org.glassfish.jersey.server.ChunkedOutput$1.call(ChunkedOutput.java:190)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:242)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:347)
at org.glassfish.jersey.server.ChunkedOutput.flushQueue(ChunkedOutput.java:190)
at org.glassfish.jersey.server.ChunkedOutput.write(ChunkedOutput.java:180)
at ch.company.app.controller.MyController$1.run(MyController.java:62)
at java.lang.Thread.run(Thread.java:745)
奇怪的是,有时候,在重新启动Glassfish(4.1)和新的部署之后,调用该方法时,我实际上得到了1到90次所需的输出(没有使用
Thread.sleep()
->为什么它出现在这里的注释中),之后又出现了NullPointerException。据我所知,它只做了一次

NullPointerException前的输出示例:

: this is a test comment
event: message-to-client
id: c0
data: Hello world 0!
My web.xml关于jersey servlet 2.x容器过滤器:

<filter>
    <filter-name>jersey</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>ch.company.app</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
        <param-value>^.+?\.(?:bmp|gif|png|jpg|jpeg|ico|css|js|pdf|txt|svg|eot|otf|ttf|woff|map)$</param-value>
    </init-param>
</filter>
<!--
<filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

运动衫
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
ch.company.app
jersey.config.servlet.filter.staticContentRegex
^.+?\(?:bmp | gif | png | jpg | jpeg | ico | css | js | pdf | txt | svg | eot | otf | ttf | woff | map)$
<filter>
    <filter-name>jersey</filter-name>
    <filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>ch.company.app</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
        <param-value>^.+?\.(?:bmp|gif|png|jpg|jpeg|ico|css|js|pdf|txt|svg|eot|otf|ttf|woff|map)$</param-value>
    </init-param>
</filter>
<!--
<filter-mapping>
    <filter-name>jersey</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>ch.company.app</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.sse.SseFeature</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.disableMoxyJson</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.servlet.filter.staticContentRegex</param-name>
        <param-value>^.+?\.(?:bmp|gif|png|jpg|jpeg|ico|css|js|pdf|txt|svg|eot|otf|ttf|woff|map)$</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.sse.SseFeature</param-value>
</init-param>
<servlet>
    <servlet-name>ch.company.app.ApplicationConfig</servlet-name>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>ch.company.app.ApplicationConfig</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ch.company.app.ApplicationConfig</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
public class ApplicationConfig extends Application {
  @Override
  public Set<Class<?>> getClasses() {
    Set<Class<?>> resources = new java.util.HashSet<>();
    addRestResourceClasses(resources);
    return resources;
  }

  private void addRestResourceClasses(Set<Class<?>> resources) {
    resources.add(ch.company.app.controller.AppController.class);
    resources.add(ch.company.app.controller.IndexController.class);
  }
}