捕获异常streamingoutput

时间:2017-09-19 17:31:54

标签: java http outputstream resource-cleanup

我见过很多关于如何使用StreamingOutput的例子。在我的情况下,我想用它来从数据库查询流式传输ResultSet。

ResultSet rs = (ResultSet) obj;
StreamingOutput stream = new StreamingOutput() {
    @Override
    public void write(OutputStream os) throws IOException,
                                       WebApplicationException {
        ResultSetFormatter.outputAsJSON(os, rs);

        res.close();
    }
};

return Response.ok(stream).build();

在这个意义上,write方法定义包含throws IOException, WebApplicationException。我的问题出现了。我需要正确关闭与数据库,结果集等的连接。如果在执行流式传输时抛出异常,我不知道如何捕获它。

我已经尝试了以下但是它不是有效的代码,因为不会从try-catch块抛出IOException。

try {
    ....  launch request to database ...
    ResultSet rs = (ResultSet) obj;
    StreamingOutput stream = new StreamingOutput() {
        @Override
        public void write(OutputStream os) throws IOException,
                                           WebApplicationException {
            if (accept.equals("application/json") {
                ResultSetFormatter.outputAsJSON(os, rs);
            } else {
                ResultSetFormatter.outputAsXML(os, rs);
            }

            res.close();
        }
    };

    return Response.ok(stream).build();
} catch (IOException | WebApplicationException e) {
    // Do cleanup
}

我该怎么办?有可能正确清理一切吗?我甚至认为在write方法中包括所有数据处理,但问题是如果没有修复,我就不能设置响应的Content-type。

TIA

编辑1:我正在使用基于Jena而不是SQL数据库的SPARQL语句。根据查询的类型,我得到不同类型的响应(模型,结果集或布尔值)。然后每个人都有不同的有效内容类型,因此在执行或分析查询之前,我无法设置响应的内容类型。

2 个答案:

答案 0 :(得分:0)

您可以查看try-with-resources,它会自动关闭它。

在Java SE 7之前,要走的路是finally。无论try出口点如何,它都会执行。

答案 1 :(得分:0)

user8是对的,但没有提供详细信息。您希望在write方法中使用try-with-resources语句:

@Override
public void write(OutputStream os) throws IOException,
                                   WebApplicationException {

    try (Statement statement = rs.getStatement();
         Connection conn = statement.getConnection()) {

        if (accept.equals("application/json") {
            ResultSetFormatter.outputAsJSON(os, rs);
        } else {
            ResultSetFormatter.outputAsXML(os, rs);
        }
    }
}

自动关闭声明也将automatically close the ResultSet