2

我使用嵌套接口来存储字符串常量:

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}"/>

但它不起作用,正确的方法是什么?

4

3 回答 3

6

当你编译你的代码时,Constants接口编译成 3 个类文件:

在此处输入图像描述

那是因为level1嵌套接口编译成带有名称的类文件,Constants$level1level2嵌套嵌套接口编译成带有名称的类文件Constants$level1$level2

现在您知道如何引用第二个嵌套level2检索常量,如下所示:

<entry key="key" value="#{T(com.company.Constants$level1$level2).CONSTANT}"/>
于 2013-05-31T11:55:13.683 回答
0

内部类通常由 $ 符号而不是点分隔。

要获得正确的 T(...) 值,只需在 java 中调用: level2.class.getName() 并使用此值。

但我不确定是否需要将接口声明为公共才能在 SPEL 中工作。

于 2013-05-31T05:28:21.267 回答
0

这对我来说非常有效。我在@PreAuthorize("hasAuthority(T(package.TheClass$NestedInterface1$NestedInterface2$NestedInterface3).Constant)") 中使用它

它有效,但不幸的是,它非常冗长..

于 2017-06-14T03:26:29.413 回答