2011-05-19 37 views
4

我有有許多的常量類:使用的String.format()作爲註釋屬性值

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); 
} 

如果我再嘗試這樣@PreAuthorize(SecurityConstants.HAS_ROLE_USER_INTERNAL)編譯器失敗,使用HAS_ROLE_USER_INTERNAL@PreAuthorize標註屬性值:

用於註釋屬性的值 PreAuthorize.value必須是常量表達式

但是如果我改變HAS_ROLE_USER_INTERNAL是一個簡單的String它工作得很好:

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

什麼用String.format()問題?字段是staticfinal,可能會出現什麼問題?

回答

7

String.format()的值在編譯時是未知的,而String字面值是。

由於註釋是已編譯類的元數據,因此編譯器生成最終的.class文件時必須知道它們的值。由於String.format()的值只有在代碼實際上是運行時纔會知道,因此編譯器不會讓您將其用作註釋的一部分。

+1

是的,好吧,但是如果普通的'String'文字支持Java格式,那麼它會好很多。 'format(「hasRole('%s')」,ROLE_NAME)''看起來比'「hasRole(''+ ROLE_NAME +'')」'IMO好得多......或者我做了太多的python編程。 :-) – parxier 2011-05-19 04:40:19

+0

我知道這是真的很晚,@parxier你有沒有考慮啓用'@ Secured'註釋('@EnableGlobalMethodSecurity(securedEnabled = true)')?那麼你可以做一些類似'@Secured({ROLE_NAME})'(角色名應該有一個明確的ROLE_前綴,例如'ROLE_NAME =「ROLE_ADMIN」;') – coderatchet 2017-06-15 01:46:15