Java无法将枚举用作注释的String参数(例如:Jackson)

ecb*_*die 10 java string enums annotations jackson

我正在编写使用Jackson进行JSON序列化的Java代码.我必须在我的类之前使用的一个注释,@JsonTypeName(/*Insert string here*/)以便为该类的对象提供序列化的唯一标识符.在我当前的代码中,我们通过使用来自另一个类的全局常量来设置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...
}
Run Code Online (Sandbox Code Playgroud)

使用这个类,我们的注释看起来像@JsonTypeName(AnnotationValues.id1).我个人并不认为这是一种非常强大的编码风格,要使用一类全局String常量.一旦我的应用程序需要处理大量的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这个枚举,我想写作@JsonTypeName(AnnotationsValues.ID1.value)我的注释.但这不起作用.我收到此错误消息:"注释属性JsonTypeName.value的值必须是常量表达式".一个简单的谷歌/ SOF搜索引导我到这个SOF帖子告诉我为什么这是一个错误; 注释参数的String值必须是常量.非常讨厌,我不能使用enum.

有没有其他人遇到这个问题?这类问题的解决方案是什么?我真的应该为我的注释使用一长串String常量吗?有什么方法可以用我的枚举来打捞吗?还要别的吗?

Jam*_*unn 7

我真的希望我或其他人可以给你一个不同的答案,但不,没有其他方法更好.在这种情况下,我们都使用了一个充满静态最终字符串的类.你尝试使其工作的方式应该起作用,但事实并非如此.就目前而言,这就是它在Java中的方式.我曾经遇到过这个问题,我也很恼火地发现Enums不能像常量表达式一样对待.我感到痛苦,再次,我希望我能给你一个不同的答案.