Самое простое решение - прочитать данные из объекта SQLXML
перед выходом из вызова JdbcTemplate
и вернуть данные в виде byte[]
, String
, DOM или чего-либо еще.
Если это нецелесообразно (например, данные слишком велики), вам нужно будет предпринять шаги, чтобы сохранить соединение открытым за пределами вызова JdbcTemplate
, а это означает использование транзакций. Открывая транзакцию перед вызовом JdbcTemplate
, соединение становится связанным с этой транзакцией и будет оставаться открытым до тех пор, пока вы не закроете транзакцию. К сожалению, чтобы держать его открытым достаточно долго для представления, требуется некоторая гимнастика.
Если у вас еще не настроены транзакции, вам понадобится компонент DataSourceTransactionManager
в вашем контексте. Затем вы могли бы написать HandlerInterceptor
для управления транзакцией, оставляя ее открытой достаточно долго для отображения представления. Spring не предоставляет удобных перехватчиков для этого из коробки, как это делает с JPA / Hibernate / etc, поэтому вам нужно написать свой собственный HandlerInterceptor
, что-то вроде этого:
public class TransactionInterceptor extends HandlerInterceptorAdapter {
private PlatformTransactionManager txManager;
public void setTxManager(PlatformTransactionManager txManager) {
this.txManager = txManager;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
TransactionStatus tx = txManager.getTransaction(new DefaultTransactionDefinition());
request.setAttribute("tx", tx);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
TransactionStatus tx = (TransactionStatus) request.getAttribute("tx");
txManager.commit(tx);
}
}
Затем вы настраиваете этот перехватчик , который будет вызываться, когда запрос вызывает ваш контроллер + представление.