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実装なので、自分で最適な実装を用意するのが筋なのかもしれない。