Компилятор Eclipse говорит, что атрибут не определен в случае массива поля перечислений в аннотации - PullRequest
4 голосов
/ 06 декабря 2011

Я использую Spring Security 3.1.0.RC3, потому что возможность защищать методы с привилегиями enum была введена в 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 -> Clean:

The attribute value is undefined for the annotation type SecuredEnum    

и предлагает быстрое решение:

Create attribute 'value()'

Итак, вот мой обходной путь: я применяю это исправление и закомментирую поле массива в аннотации:

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

   public PrivilegeEnum value();
}

После этого eclipse правильно компилирует все классы (кроме тех, где @SecuredEnum имеет две или более привилегий). Следующий шаг - раскомментировать старое поле массива и удалить новое поле, созданное с помощью быстрого исправления. В результате все отлично скомпилировано. Так что это довольно неприятно делать каждый раз, когда проект очищается. Другая проблема заключается в том, что я не могу воспроизвести эту проблему в примере проекта, поэтому, возможно, в этом тексте вопроса отсутствует некоторая важная информация. Чья это ошибка и как ее можно исправить?

UPDATE: ни использование явного массива в аргументе аннотации (т.е. добавление скобок {}), ни явное определение имени аргумента ('значения'), ни использование полностью определенного значения перечисления вместо статического импорта помогает

Ответы [ 2 ]

0 голосов
/ 16 августа 2012

В Eclipse Juno (4.2) мне просто нужно было изменить (вставить пустое, удалить пустое) и сохранить файл с ложным срабатыванием, чтобы избавиться от ошибки «неопределенное значение».

Я должен сделать это один раз, каждый раз, когда я изменяю настройки компилятора, но затем он исчезает до тех пор ...

0 голосов
/ 04 января 2012

Может быть проблема с политикой хранения, которую вы не определили в своей пользовательской аннотации.Таким образом, политика хранения по умолчанию для класса.Это должно быть время выполнения, по крайней мере, это то, что ребята из Spring Security используют для аннотации @Secured.

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