2013-05-31 1 views
1

я использовать вложенные интерфейсы для хранения строковых констант:выражение Spring SPEL, доступ к вложенным интерфейс строковые константы

public interface Constants{ 
    interface level1 { 
     interface level2 { 
      String CONSTANT = "constant"; 
     } 
    } 
} 

Я хочу, чтобы ввести эти константы в поле весной значение, я попробовал:

<entry key="key" value="#{com.company.Constants.level1.level2.CONSTANT}"/> 
<entry key="key" value="#{T(com.company.Constants.level1.level2).CONSTANT}"/> 

Но это не работает, каков правильный путь?

ответ

0

Внутренние классы обычно разделяются знаком $, а не точкой.

Чтобы получить правильное значение T (...), просто вызовите: level2.class.getName() в java и используйте это значение.

Но я не уверен, что интерфейс должен быть объявлен открытым, чтобы иметь возможность работать в SPEL.

+0

я могу Не находите ссылки на $ в документации SPeL, и она не работает. –

+0

Каков вывод, если вы делаете вызов, который я написал простым простым способом? –

4

При компиляции кода интерфейс Constants компилируется в 3 класса файлов:

enter image description here

и это потому, что level1 вложенная интерфейс компилируется в файл классов с именем Constants$level1 и вложенная вложенным интерфейс level2 компилируется в classfile с именем Constants$level1$level2.

Теперь, когда вы знаете, как ссылаться на второй вложенной level2 получить константу следующим образом:

<entry key="key" value="#{T(com.company.Constants$level1$level2).CONSTANT}"/> 
0

Это отлично работает для меня. Я использую его в @PreAuthorize ("hasAuthority (T (package.TheClass $ NestedInterface1 $ NestedInterface2 $ NestedInterface3) .Constant)")

Это работает, но, к сожалению, это очень многословны ..

+0

Теперь я использую другой способ: @PreAuthorize ("hasAuthority ('" + Constants.NestedInterface.Constant + "')") – Mathew

Смежные вопросы