Использование String.format () в качестве значения атрибута аннотации - PullRequest
6 голосов
/ 19 мая 2011

У меня есть класс, который имеет несколько констант:

public class SecurityConstants {
    private static final String HAS_ROLE_TEMPLATE = "hasRole('%s')";

    public static final String ROLE_USER_INTERNAL = "ROLE_USER_INTERNAL";
    public static final String HAS_ROLE_USER_INTERNAL = String.format(HAS_ROLE_TEMPLATE, ROLE_USER_INTERNAL);
}

Если я тогда попытаюсь использовать HAS_ROLE_USER_INTERNAL в качестве @PreAuthorize значения атрибута аннотации, как этот @PreAuthorize(SecurityConstants.HAS_ROLE_USER_INTERNAL) компилятор завершится неудачно с:

Значение атрибута аннотации PreAuthorize.value должно быть константным выражением

Однако, если я изменю HAS_ROLE_USER_INTERNAL на простой String, все будет работать нормально:

public static final String HAS_ROLE_USER_INTERNAL = "hasRole('ROLE_USER_INTERNAL')";

В чем проблема с использованием String.format()?Поле static и final, что может пойти не так?

1 Ответ

8 голосов
/ 19 мая 2011

Значение String.format() не известно во время компиляции, тогда как литерал String равен.

Поскольку аннотации представляют собой метаданные скомпилированного класса, их значения должны быть известны к моменту, когда компилятор сгенерирует окончательный файл .class. Поскольку значение String.format() будет известно только после того, как код фактически запустит , компилятор не позволит вам использовать его как часть аннотации.

...