Java StreamingOutput未引发WebApplicationException,返回空响应

Java StreamingOutput未引发WebApplicationException,返回空响应,java,jersey-2.0,Java,Jersey 2.0,我很难从我的StreamingOutput实现中抛出WebApplicationException。我希望下面的代码返回501,但是curl报告服务器的curl:(52)空回复。我可以在电话的痕迹中看到503,但泽西只是空着身子回答。有人知道什么给你吗 public final class MyStreamingOutput implements StreamingOutput { @Override public void write(final OutputStream o

我很难从我的
StreamingOutput
实现中抛出
WebApplicationException
。我希望下面的代码返回501,但是curl报告服务器的
curl:(52)空回复。我可以在电话的痕迹中看到503,但泽西只是空着身子回答。有人知道什么给你吗

public final class MyStreamingOutput implements StreamingOutput {

    @Override
    public void write(final OutputStream outputStream)
        throws IOException {

        try {
            dataProvider = new DataProvider(); // throws SQLException
        } catch (final SQLException e) {
            throw new WebApplicationException(503);
        }
    }
}
这是我看到的痕迹:

java.sql.SQLException: Invalid object name 'no_such_table'.
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368) ~[jtds-1.2.4.jar:1.2.4]
...
16:05:22.148 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - MBW_WRITE_TO WriteTo by [org.glassfish.jersey.message.internal.StreamingOutputProvider @1d45d135] [642.98 ms]
16:05:22.148 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - WI_AFTER [org.glassfish.jersey.filter.LoggingFilter @77edc290 #-2147483648] AFTER context.proceed() [ 0.00 ms]
16:05:22.148 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - WI_AFTER [org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor @2a0fded2 #3000] AFTER context.proceed() [ 0.01 ms]
16:05:22.148 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - WI_AFTER [org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor @26c087be #10] AFTER context.proceed() [ 0.01 ms]
16:05:22.148 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - WI_SUMMARY WriteTo summary: 3 interceptors [644.44 ms]
16:05:22.148 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - FINISHED Response status: 200/SUCCESSFUL|OK [ ---- ms]
16:05:22.153 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - EXCEPTION_MAPPING Exception mapper [com.locustec.eim.query.rest.RuntimeExceptionMapper @3a8978c7] maps [javax.ws.rs.WebApplicationException @563625d0 <501/SERVER_ERROR|Not Implemented|-no-entity->] ('Carp') to <501/SERVER_ERROR|Not Implemented> [ 0.02 ms]
16:05:22.153 [http-8080-1] INFO  o.g.jersey.filter.LoggingFilter - 8 * LoggingFilter - Response received on thread http-8080-1
8 < 503

16:05:22.154 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - RESPONSE_FILTER Filter by [org.glassfish.jersey.filter.LoggingFilter @5271b383 #-2147483648] [ 0.13 ms]
16:05:22.154 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - RESPONSE_FILTER_SUMMARY Response summary: 1 filters [ 0.93 ms]
16:05:22.155 [http-8080-1] DEBUG org.glassfish.jersey.tracing.general - FINISHED Response status: 501/SERVER_ERROR|Not Implemented [ ---- ms]
16:05:22.160 [http-8080-1] TRACE o.g.j.process.internal.RequestScope - [DEBUG] Released scope instance Instance{id=021c24a2-c224-4c22-8f18-e5f7f93b0295, referenceCounter=0, store size=0} on thread http-8080-1
java.sql.SQLException:无效的对象名称“没有这样的表”。
在net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)~[jtds-1.2.4.jar:1.2.4]
...
16:05:22.148[http-8080-1]调试org.glassfish.jersey.tracing.general-MBW_WRITE_TO WriteTo by[org.glassfish.jersey.message.internal.StreamingOutputProvider@1d45d135][642.98 ms]
16:05:22.148[http-8080-1]调试org.glassfish.jersey.tracing.general-WI_在[org.glassfish.jersey.filter.LoggingFilter@77edc290#-2147483648]之后上下文。继续()
16:05:22.148[http-8080-1]调试org.glassfish.jersey.tracing.general-WI_在[org.glassfish.jersey.server.internal.json之后,在上下文之后使用paddinginterceptor@2a0fded2#3000。继续()
16:05:22.148[http-8080-1]调试org.glassfish.jersey.tracing.general-WI_在[org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor@26c087be#10]之后,在context.procement()之后
16:05:22.148[http-8080-1]调试org.glassfish.jersey.tracing.general-WI_摘要写入摘要:3个拦截器[644.44 ms]
16:05:22.148[http-8080-1]DEBUG org.glassfish.jersey.tracing.general-完成响应状态:200/成功|正常[----ms]
16:05:22.153[http-8080-1]DEBUG org.glassfish.jersey.tracing.general-异常映射异常映射器[com.locastec.eim.query.rest.RuntimeExceptionMapper@3a8978c7]将[javax.ws.rs.WebApplicationException@563625d0]('Carp')映射到[0.02 ms]
16:05:22.153[http-8080-1]INFO o.g.jersey.filter.LoggingFilter-8*LoggingFilter-在线程http-8080-1上收到响应
8 < 503
16:05:22.154[http-8080-1]调试org.glassfish.jersey.tracing.general-响应过滤器由[org.glassfish.jersey.FILTER.LoggingFilter@5271b383#-2147483648][0.13 ms]
16:05:22.154[http-8080-1]调试org.glassfish.jersey.tracing.general-响应\过滤器\摘要响应摘要:1个过滤器[0.93毫秒]
16:05:22.155[http-8080-1]DEBUG org.glassfish.jersey.tracing.general-完成响应状态:501/SERVER|u ERROR |未实现[----ms]
16:05:22.160[http-8080-1]跟踪o.g.j.process.internal.RequestScope-[DEBUG]已发布的作用域实例实例{id=021c24a2-c224-4c22-8f18-e5f7f93b0295,引用计数器=0,存储大小=0}在线程http-8080-1上

Jersey正在开始HTTP响应,因此发送一个200 OK,并且只有在这之后才开始调用您的
StreamingOutput.write
实现。因此,当引发异常时,发送其他HTTP代码已经太晚了

我发现处理此类问题的最佳方法是在
StreamingOutput
之外或在实现的构造函数中尽可能多地执行操作(这些版本将发送500,如果需要其他内容,您可以捕获
SQLException
):


这样,在HTTP响应启动之前就会抛出异常,您可以拥有不同的状态。

501/503不匹配是打字错误吗?我也遇到了同样的问题,试图将运行时异常从第三方库映射到一个合理的状态代码-还没有运气:(是的,这是一个输入错误。任何一个都可以…只是不是500,或者我看到的,什么都没有-一个完全空的响应。
@GET
public StreamingOutput getDataWithAnonymousClass() throws SQLException {
    final DataProvider dataProvider = new DataProvider();
    return new StreamingOutput() {
        @Override
        public void write(OutputStream output) {
            dataProvider.writeData(output);
        }
    }
}


public final class MyStreamingOutput implements StreamingOutput {

    private final DataProvider dataProvider;

    public MyStreamingOutput() throws SQLException {
        this.dataProvider = new DataProvider();
    }

    @Override
    public void write(OutputStream output) {
        dataProvider.writeData(output);
    }
}

@GET
public StreamingOutput getDataWithExcInConstructor() throws SQLException {
    return new MyStreamingOutput();
}