我无法使用从常量中取得的枚举作为注释中的参数.我得到这个编译错误:"注释属性[attribute]的值必须是枚举常量表达式".
这是Enum代码的简化版本:
public enum MyEnum {
APPLE, ORANGE
}
Run Code Online (Sandbox Code Playgroud)
对于注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {
String theString();
int theInt();
MyEnum theEnum();
}
Run Code Online (Sandbox Code Playgroud)
和班级:
public class Sample {
public static final String STRING_CONSTANT = "hello";
public static final int INT_CONSTANT = 1;
public static final MyEnum MYENUM_CONSTANT = MyEnum.APPLE;
@MyAnnotation(theEnum = MyEnum.APPLE, theInt = 1, theString = "hello")
public void methodA() {
}
@MyAnnotation(theEnum = MYENUM_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
}
} …Run Code Online (Sandbox Code Playgroud) 我正在编写使用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常量吗?有什么方法可以用我的枚举来打捞吗?还要别的吗?
我需要编写一个Annotation来从结果集中排除某些值.
背景:
从字段中选择不同的值,并在ComboBox中列出.一些遗留值是Deprecated,我不想显示它们,即使它们是由JDBC返回的SELECT DISTINCT().它就像一个迷你框架,人们可以通过单击ComboBoxes中的值来构建选择查询.
我尝试了以下(代码不编译 - 注释行是我尝试解决问题的方法):
public enum JobType {
//...
S,
//...
}
public @interface Exclude {
Object[] values(); // Invalid type
Enum[] values(); // Invalid type again
String[] values(); // Accepts but see the following lines
}
@Table(name = "jobs_view")
public class JobSelectionView extends View {
//...
@Exclude(values = {JobType.S.toString()}) // Not a constant expression
@Exclude(values = {JobType.S.name()}) // Not a constant expression ?!?!?!
@Exclude(values = {"S"}) // Works but... come on!
@Enumerated(value = EnumType.STRING) …Run Code Online (Sandbox Code Playgroud) 我有以下情况.
public enum TestEnum{
PUUNITONE("puunitone"),
PUUNITTWO("puunittwo");
private String name;
private TestEnum(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
在EJB @stateless课堂上
@PersistenceContext(unitName = TestEnum.PUUNITONE.getName())
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
我有以下内容
Compilation Error: Value must be a constant
Run Code Online (Sandbox Code Playgroud)
现在我的问题:
1.在java中是不是枚举常量?如果是,这里的问题是什么?
2.使用Enum作为常量来解决这个问题还有办法或工作方法吗?
非常感谢任何建议
java ×4
annotations ×3
enums ×3
coding-style ×1
hibernate ×1
jackson ×1
java-ee ×1
jpa ×1
string ×1