我正在编写使用 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/