我见过很多关于如何使用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语句。根据查询的类型,我得到不同类型的响应(模型,结果集或布尔值)。然后每个人都有不同的有效内容类型,因此在执行或分析查询之前,我无法设置响应的内容类型。
答案 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。