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

标签 java string enums annotations jackson

我正在编写使用 Jackson 的 Java 代码用于 JSON 序列化。我必须在我的类(class)之前使用的一个注释是 @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...
}

使用这个类,我们的注释看起来像 @JsonTypeName(AnnotationValues.id1)。我个人不认为这是一种非常健壮的编码风格,使用一类全局 String 常量。一旦我的应用程序需要处理大量 JSON 消息并因此需要许多不同的标识符,这就会变得很烦人。通常,我自然会通过使用 enum 来解决这个问题。我会将类(class)替换为:

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 的值必须是常量表达式”。一个简单的谷歌/SOF 搜索引导我到 this SOF post告诉我为什么这是一个错误;注释参数的字符串值必须是常量。很烦人,我不能使用 enum

有没有其他人遇到这个问题?此类问题的公认解决方案是什么?我真的应该为我的注释使用一长串字符串常量吗?有什么办法可以使用我的枚举来挽救吗?还有什么吗?

最佳答案

我真的希望我或其他人能给你一个不同的答案,但是不行,没有其他方法可以更好地工作。在这种情况下,我们都无法使用充满静态最终字符串的类。您尝试使其工作的方式应该有效,但事实并非如此。目前,这只是 Java 中的方式。我自己遇到过一次这个问题,我也很生气地发现枚举不能像常量表达式一样对待。我感受到你的痛苦,再次希望我能给你一个不同的答案。

关于Java 无法将枚举用作注释的字符串参数(例如 : Jackson),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625422/

相关文章:

c# - 枚举到 int 最佳实践

c# - 测试单个值的 [Flags] 枚举值

java - 如果用户关闭单独的窗口,为什么我的应用程序会终止?

java - Nashorn ScriptEngine 未在 Karaf+Felix (openJDK) 上找到/注册

java - Java 中的字符串长度(以像素为单位)

java - 在java中使用命令行接受文件名

java - 在 Intellij-IDEA 13 中,版本 12 的工具窗口按钮发生了什么变化?

java - Java Google Gmail Api 位于何处?

python - 如何从 Python 中的字符串数组的偏移量中去除前导空格?

java - java 数组分割字符串