Я видел много примеров использования 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
. Вот где возникает моя проблема. Мне нужно правильно закрыть соединение с базой данных, набором результатов и т. Д. И если во время потоковой передачи возникает исключение, я не знаю, как его захватить.
Я пробовал следующее, но это недопустимый код, поскольку IOException не выбрасывается из блока try-catch.
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: я использую предложения SPARQL на основе Jena, а не базы данных SQL. В зависимости от типа запроса я получаю разные типы ответов (модель, набор результатов или логическое значение). Тогда у каждого из них есть разные допустимые типы контента, поэтому я не могу установить тип контента ответа, пока запрос не будет выполнен или проанализирован.