私のwebappコントローラーでは、dbから結果を取得しています。これはタイプjava.sql.SQLXML
です。それをビューに渡して、逐語的に(XMLとして)返されるようにします。
問題は、JdbcTemplate呼び出しを終了するとすぐに、SQLXMLに関連付けられたデータが解放されることです。次に、モデルを使用してデータをビューに渡すにはどうすればよいですか?
私のwebappコントローラーでは、dbから結果を取得しています。これはタイプjava.sql.SQLXML
です。それをビューに渡して、逐語的に(XMLとして)返されるようにします。
問題は、JdbcTemplate呼び出しを終了するとすぐに、SQLXMLに関連付けられたデータが解放されることです。次に、モデルを使用してデータをビューに渡すにはどうすればよいですか?
最も簡単な解決策はSQLXML
、呼び出しを終了する前にオブジェクトからデータを読み取り、データを、、DOM などJdbcTemplate
として返すことです。byte[]
String
それが実用的でない場合 (データが大きすぎるなど)、呼び出しの範囲を超えて接続を開いたままにしておく必要がありますJdbcTemplate
。これは、トランザクションを使用することを意味します。を呼び出す前にトランザクションを開くとJdbcTemplate
、接続はそのトランザクションにバインドされ、トランザクションを閉じるまで開いたままになります。残念ながら、ビューがレンダリングされるのに十分な時間開いたままにしておくには、多少の体操が必要です。
トランザクションがまだセットアップされていないと仮定するとDataSourceTransactionManager
、コンテキストに Bean が必要になります。次に、トランザクションを管理する を記述し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);
}
}
次に、リクエストがコントローラーとビューを呼び出すときに、このインターセプターが呼び出されるように構成します。