我正在编写使用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...
}
使用这个类,我们的注解看起来像@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
.
还有其他人遇到这个问题吗?此类问题的公认解决方案是什么?我真的应该为我的注释使用一长串字符串常量吗?有什么办法可以使用我的枚举来挽救?还要别的吗?