[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 メーリングリストの案内