10

JSONシリアル化にJacksonを使用するJavaコードを書いています。@JsonTypeName(/*Insert string here*/)このクラスのオブジェクトにシリアル化用の一意の識別子を与えるために、クラスの前に使用する必要がある注釈の1つはです。現在のコードでは、別のクラスのグローバル定数を使用してString引数を設定しています。例:

public class AnnotationValues {
    private static final String id1 = "1";
    private static final String id2 = "2";
    private static final String id3 = "3";
    // And so on...
}

このクラスを使用すると、アノテーションはのようになります@JsonTypeName(AnnotationValues.id1)。私は個人的に、これがグローバル文字列定数のクラスを使用するための非常に堅牢なコーディングスタイルであるとは思いません。アプリケーションが大量のJSONメッセージを処理する必要があり、したがって多くの異なる識別子が必要になると、これは煩わしくなります。私は当然、一般的に、を使用してこの問題を解決しenumます。クラスを次のように置き換えます。

public enum AnnotationValues {
    ID1("1"),
    STATS_RESPONSE("2"),
    SESSION_RESPONSE("3"),
    /* Add more... */;
    public final String value;
    private AnnotationValues(String value) {
        this.value = value;
    }
}

@JsonTypeName(AnnotationsValues.ID1.value)この列挙型を使用して、注釈として書きたいと思います。しかし、これは機能しません。「アノテーション属性JsonTypeName.valueの値は定数式である必要があります」というエラーメッセージが表示されます。単純なGoogle/SOF検索により、このSOF投稿が表示され、これがエラーであった理由がわかります。注釈パラメータの文字列値は定数でなければなりません。使用できないのはかなり迷惑ですenum

他の誰かがこの問題に遭遇しますか?このタイプの問題に対して受け入れられている解決策は何ですか?注釈に文字列定数の長いリストを使用することになっていますか?列挙型を使用して救済する方法はありますか?他に何か?

4

2 に答える 2

7

私や他の誰かがあなたに別の答えを与えることができれば本当にいいのですが、いいえ、他にもっとうまくいく方法はありません。このような場合、私たちは皆、静的な最終文字列でいっぱいのクラスを使用して立ち往生しています。あなたがそれを機能させようとした方法は機能するはずですが、そうではありません。今のところ、これはJavaの場合とまったく同じです。私は一度この問題に遭遇しましたが、列挙型を定数式のように扱うことができないことに私も悩まされました。私はあなたの痛みを感じます、そしてまた、私はあなたに別の答えを与えることができればいいのにと思います。

于 2013-03-19T17:16:49.677 に答える