4

Google App Engine for Java で Objectify を使用しています。Enum#name()を使用して定数を単純に保存/ロードする提供されたEnumTranslatorFactoryを使用して、データストアにさまざまな列挙型定数を永続化します。これはうまくいきます。

アプリの新しいバージョンを GAE にリリースすると、新しいバージョンは古いバージョンの隣に存在し、クライアントに同時にリクエストを提供します。これは、Google のトラフィック分割ドキュメントでよく説明されています。

システムのアップグレードにより、読み込み中にエラーを引き起こす新しい Enum 定数が導入されます。例えば:

バージョン 1 には次の列挙型があります。

enum Meal{BREAKFAST,LUNCH,DINNER}

バージョン 2 には、英国の食事をサポートするために列挙型に追加された追加の定数があります。

enum Meal{BREAKFAST,LUNCH,TEA,DINNER}

アプリのバージョン 2 をテストしている間、TEA はいくつかのエンティティで永続化されます。その後、バージョン 1 はそのエンティティをロードし、Objectify はランタイム例外をスローする Enum#valueOf(...) を使用して TEA を Enum に変換しようとします。

Objectify docsは列挙型のデータ移行について説明していますが、上記の状況を満たしていません。

この状況に対処する最善の方法についての提案に興味があります。

4

3 に答える 3

0

まだ不明な値に対してnullを提供する独自のカスタム EnumTranslatorFactory を記述します。

        ....
            return new ValueTranslator<Enum<?>, String>(path, String.class) {
        @Override
        public Enum<?> loadValue(String value, LoadContext ctx) {
            try{
               return Enum.valueOf((Class<Enum>)type, value.toString());
            }catch(Exception e){
                return null;
            }
        }

        ...

プロパティが必要な場合があり、null を指定すると他のコードが失敗する可能性があるため、これは理想的ではありません。コード ベースで永続化された列挙型のすべてのプロパティは、@Nullable である必要があります。

于 2013-07-19T11:41:44.953 に答える