Java 使用String.format()作为注释属性值
我有一个类,它有许多常量:Java 使用String.format()作为注释属性值,java,annotations,constants,string-formatting,Java,Annotations,Constants,String Formatting,我有一个类,它有许多常量: 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 = Str
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
更改为一个简单的字符串
,它就可以正常工作:
public static final String HAS_ROLE_USER_INTERNAL = "hasRole('ROLE_USER_INTERNAL')";
使用
String.format()
有什么问题?字段为静态
和最终
,可能会出现什么错误?编译时不知道字符串.format()
的值,而字符串
文本是未知的
由于注释是已编译类上的元数据,因此在编译器生成最终的.class文件时必须知道它们的值。由于
String.format()
的值只有在代码实际运行时才会被知道,因此编译器不允许您将其作为注释的一部分使用。是的,好吧,但是如果普通String
文本支持Java格式,那就更好了<代码>格式(“hasRole('%s'),ROLE\u NAME)看起来比“hasRole('“+ROLE\u NAME+”)”)”
我。。。或者我做了太多python编程工作。:-)我知道这太晚了,@parxier您是否考虑过启用@Secured
注释(@EnableGlobalMethodSecurity(securedEnabled=true)
)?然后,你可以做一些事情,比如“代码> @安全”({ RoLyNeN})< />代码(角色名应该有一个显式的RoLyf前缀,例如:代码> RoLyNeNe=“RoLyAdmin”;),遗憾的是,java没有C++的CONTHEXPR关键字: