[Seasar-user:2813] S2Dao にて Stream を扱いたい
NAKAMURA Manabu
under_the_starry
2005年 11月 11日 (金) 19:09:04 JST
こんにちは、中村です。
S2Dao の更新SQL自動生成において、
InputStream を使用したいのですが、
具象クラスが何かわからないと
ValueTypes.getValueType() にて
意図した ValueType が返されないので困っています。
何かいい方法は無いでしょうか?
以下、背景です。
PostgreSQL上に以下のテーブルがありまして、
CREATE TABLE photo (
photoId SERIAL PRIMARY KEY,
size BIGINT DEFAULT 0 NOT NULL,
data BYTEA NOT NULL,
mime TEXT DEFAULT '' NOT NULL,
);
バイナリデータを持つ data というカラムがあるのですが、
結構大きなデータが入るので Stream で扱いたいのです。
以下のようなクラスを作成して
public class Photo {
private int photoId;
private long size;
private InputStream data;
private String mime;
// getter, setter 省略
}
public interface PhotoDao {
Class BEAN = Photo.class;
Photo findById(int id);
void insert(Photo photo);
}
S2Daoを利用しようとしました。
標準では、bytea 型のカラムは byte[] にしないといけないので、
public class BinaryStreamValueType implements ValueType {
public Object getValue(ResultSet rs, int index) throws SQLException {
return rs.getBinaryStream(index);
}
public Object getValue(ResultSet rs, String column) throws SQLException {
return rs.getBinaryStream(column);
}
public void bindValue(PreparedStatement ps, int index, Object value)
throws SQLException {
try {
InputStream in = (InputStream) value;
ps.setBinaryStream(index, in, in.available());
} catch (IOException e) {
throw RuntimeExceptionWrapper.wrap(e);
}
}
}
というクラスを作成し、
ValueTypes.registerValueType(InputStream.class, new BinaryStreamValueType());
とやった所、findById() では意図した通りに動作したのですが、
insert() では動きませんでした。
ソースを追ってみたところ、
検索系SQLの自動生成では、Bean のプロパティの戻り値の型で
ValueTypes.getValueType() を行っているため、
BinaryStreamValueType が返されてきたのですが、
更新系SQLの自動生成の場合、実際に返される InputStream の具象クラスで
ValueTypes.getValueType() を行っているため、
一致するものが見つかられず ObjectType が返されます。
InputStream の全てのサブクラスで
ValueTypes.registerValueType() をやるわけにもいかないし、
独自でInputStreamのサブクラスを作られていたら
手におえないので、つまってしまいました。
何か対処法がありましたらご教授いただけないでしょうか?
よろしくお願いいたします。
--------------------------------------
中村 学/NAKAMURA Manabu
[E-MAIL ADDRESS DELETED]
--------------------------------------
Seasar-user メーリングリストの案内