Eclipse编译器说,如果注释中的枚举字段数组,则属性未定义

时间:2011-12-06 13:34:08

标签: java eclipse enums annotations spring-security

我使用的是Spring Security 3.1.0.RC3,因为3.1中引入了使用枚举权限保护方法的可能性。

这是我的注释:

public @interface SecuredEnum
{
  public PrivilegeEnum[] value();
}

以下是我如何使用它:

import static somepath1.PrivilegeEnum.SOME_PRIV1;

public interface MyService extends BaseService {
  @SecuredEnum(SOME_PRIV1)
  void insertOrUpdateMyObject(MyObject myObject);
}

javac每次都正确编译此代码,但是eclipse(Indigo SR1)编译器在Project之后出现错误 - >清洁:

The attribute value is undefined for the annotation type SecuredEnum    

并建议快速修复:

Create attribute 'value()'

所以这是我的解决方法:我应用此修复程序,并注释注释中的数组字段:

public @interface SecuredEnum
{
  // public PrivilegeEnum[] value();

   public PrivilegeEnum value();
}

之后,eclipse正确编译所有类(除了@SecuredEnum具有两个或更多权限的那些类)。下一步是取消注释旧数组字段并删除快速修复创建的新字段。结果,一切都完美编译。 因此,每次清理项目时都会非常烦人。另一个问题是我无法通过示例项目重现此问题,因此可能在此问题文本中缺少一些重要信息。 这是谁的错误,怎么可能修复它?

更新: 既不在注释参数中使用显式数组(即添加{}括号),也不显式定义参数名称('值'),也不使用完全限定的枚举值而不是静态导入帮助

2 个答案:

答案 0 :(得分:0)

保留政策可能存在问题,您尚未在自定义注释中定义该政策。因此保留策略默认为class。它应该是运行时,至少是Spring Security人员用于@Secured注释的内容。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})    
public @interface SecuredEnum {
    public PrivilegeEnum[] value();
}

答案 1 :(得分:0)

使用Eclipse Juno(4.2)我只需要更改(插入空白,删除空白)并使用误报保存文件以消除“未定义值”错误。

每次我更改编译器设置时,我都必须这样做一次,但直到那时它才消失......