0

質問のタイトルがすべてを物語っています。次のように宣言されたフィールドがあります。

    @DatabaseField(canBeNull=false,dataType=DataType.SERIALIZABLE)
    List<ScheduleTriggerPredicate> predicates = Collections.emptyList();

コンテキストに応じてpredicates、空のリストまたは によって返される不変のリストをパラメーターとして含めることができCollections.unmodifiableList(List)ますArrayList。したがって、問題のオブジェクトがシリアライズ可能であることはわかっていますが、コンパイラ (したがって ORMLite) にシリアライズ可能であることを伝える方法はありません。したがって、次の例外が発生します。

SEVERE: Servlet /ADHDWeb threw load() exception
java.lang.IllegalArgumentException: Field class java.util.List for field
    FieldType:name=predicates,class=ScheduleTrigger is not valid for type 
    com.j256.ormlite.field.types.SerializableType@967d5f, maybe should be
    interface java.io.Serializable

さて、チェックを無効にする方法があれば、すべてが明らかにうまくいくでしょう...

4

1 に答える 1

6

カスタム データ型の定義については、FM で十分に文書化されています。

http://ormlite.com/docs/custom-data-types

SerializableTypeクラスと@OverrideメソッドisValidForField(...)を拡張できます。この場合、これはコレクションをシリアライズします。

public class SerializableCollectionsType extends SerializableType {
    private static LocalSerializableType singleton;
    public SerializableCollectionsType() {
        super(SqlType.SERIALIZABLE, new Class<?>[0]);
    }
    public static LocalSerializableType getSingleton() {
        if (singleton == null) {
            singleton = new LocalSerializableType();
        }
        return singleton;
    }
    @Override
    public boolean isValidForField(Field field) {
        return Collection.class.isAssignableFrom(field.getType());
    }
}

これを使用するには、dataTypepersisterClassin に置き換える必要があり@DatabaseFieldます。

@DatabaseField(canBeNull = false,
    persisterClass = SerializableCollectionsType.class)
List<ScheduleTriggerPredicate> predicates = Collections.emptyList();

これで動作するコードを表示するために、単体テストに追加しました。これがgithubの変更です。

于 2013-03-28T19:34:19.503 に答える