2010-04-03 74 views
0

在我的Web應用程序控制器中,我得到了db的結果,它們的類型爲java.sql.SQLXML。 我想將它傳遞給視圖以逐字返回(如XML)。如何傳遞SQLXML類型以在Spring MVC中查看?

問題是,一旦我離開JdbcTemplate調用,與SQLXML相關的數據就會被釋放。那麼如何使用模型將數據傳遞給視圖?

回答

0

最簡單的辦法是你離開JdbcTemplate調用之前讀取數據了SQLXML的對象,並作爲byte[]String,DOM或任何返回數據。

如果這樣做不實際(例如數據太大),那麼您需要採取措施保持連接超出JdbcTemplate調用的範圍,這意味着使用事務。通過在致電JdbcTemplate之前打開一個交易,連接就會被綁定到該交易,並且在您關閉交易之前將保持打開狀態。不幸的是,保持足夠的時間來呈現視圖需要一些體操。

假設您沒有已經設置的事務,那麼您需要在上下文中使用DataSourceTransactionManager bean。然後,您可以編寫一個HandlerInterceptor來管理事務,並將其保持足夠長的時間以供視圖呈現。 Spring並沒有爲提供方便攔截這個外的開箱,像它與JPA /休眠/等,所以你需要編寫自己的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); 
    } 
} 

你然後configure this interceptor在請求調用您的控制器+視圖時被調用。

相關問題