HTTPによるリモートDBとの同期(その5)
WebRowSet、問題山積だったが動かすことができた。
昨日書いた通りだが、内部RowSetMetaDataインタフェースを空にしている状態(まだ一度もDBにアクセスしていない状態に相当)ではRowSetのシリアライズ/デシリアライズができない(例外が発生)
仕方が無いので、クライアント側でのWebRowSetインスタンスの生成は諦め、データソース名とSQL文を普通のHTTP POSTなパラメタとして送信し、受けたサーバ側でWebRowSetのインスタンスを生成した後にクライアントに返すようにした。
- クライアント側からはデータソース名とSQL文だけをHTTP POSTで送信
sql=SELECT * FROM Hoge.FooTable&datasource=HogeDataSource
- サーバ側ではパラメタを使ってWebRowSetを生成しクライアントに返す
WebRowSetImpl rowSet = new WebRowSetImpl(); rowSet.setDataSourceName(req.getParameter("datasource")); rowSet.setCommand(req.getParameter("sql")); 〜 rowSet.execute(); rowSet.writeXml(new OutputStreamWriter(resp.getOutputStream(), encoding));
この方法でなんとか動いたが、クライアントから見て同じURLに対して送信するMIMEタイプが一度目(application/x-www-form-urlencoded)と二度目(text/xml)で違うのが非常に気に入らない。
まあ、そもそもWebRowSetImplはrt.jarに格納されているもののSunのRI実装なので、自分で最適な実装を用意するのが筋なのかもしれない。