Как передать тип SQLXML для просмотра в Spring MVC? - PullRequest
0 голосов
/ 03 апреля 2010

В моем контроллере веб-приложения я получаю результаты от базы данных типа java.sql.SQLXML. Я хочу передать его в представление, которое будет возвращено дословно (как XML).

Проблема в том, что данные, связанные с SQLXML, освобождаются, как только я покидаю вызов JdbcTemplate. Как тогда я должен передать данные в представление, используя модель?

1 Ответ

0 голосов
/ 03 апреля 2010

Самое простое решение - прочитать данные из объекта 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);
    }
}

Затем вы настраиваете этот перехватчик , который будет вызываться, когда запрос вызывает ваш контроллер + представление.

...