2010-07-19 78 views
6

我希望能夠做到這一點:我們可以在其他註釋中使用spring表達式(spel)嗎?

@Controller 
@RequestMapping("/#{handlerMappingPaths.security}/*") 
public class SecurityController { 
    etc 

    //for instance, to resuse the value as a base for the folder resolution  
    @Value("#{handlerMappingPaths.security}/") 
    public String RESOURCE_FOLDER; 

    @RequestMapping(value="/signin-again", method = RequestMethod.GET) 
    public String signinAgainHandler() { 
     return RESOURCE_FOLDER + "signin_again"; 
    } 
} 

這不會出現現在的工作,我失去的東西嗎?你可以找到這樣的事情

+0

澄清,該SPEL表達的作品只是設置的「RESOURCE_FOLDER」價值@value註釋很好,但它不會在工作@ RequestMapping註釋 – chrismarx 2010-07-19 18:08:24

回答

0

@Sean回答了春天是否支持這個問題,但我也想回答一下在使用註釋時如何不重複配置的問題。事實證明這是可能的使用靜態進口,如:

import static com.test.util.RequestMappingConstants.SECURITY_CONTROLLER_PATH 

@Controller 
@RequestMapping("/" + SECURITY_CONTROLLER_PATH + "/*") 
public class SecurityController { 
    etc 

    //for instance, to resuse the value as a base for the folder resolution  
    public String RESOURCE_FOLDER = SECURITY_CONTROLLER_PATH + "/"; 

    @RequestMapping(value="/signin-again", method = RequestMethod.GET) 
    public String signinAgainHandler() { 
     return RESOURCE_FOLDER + "signin_again"; 
    } 
} 
2

一種方法是來看看自己。這是eclipse的一個例子,但它應該類似地用於其他IDE:

首先,確保你有你正在使用的彈簧庫的來源。如果您使用maven,using the maven-eclipse-plugin或使用m2eclipse,這是最簡單的。

然後,在Eclipse中,選擇Navigate -> Open Type...。輸入你正在尋找的類型(像RequestMa*應該爲像我這樣的懶惰類型)。輸入/確定。現在右鍵單擊源文件中的類名並選擇References -> Project。在搜索視圖中,將顯示此類或註釋的所有用法。

其中之一是DefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods(Class, boolean),在此代碼段會告訴你,語言表達不評估:

ReflectionUtils.doWithMethods(currentHandlerType, new ReflectionUtils.MethodCallback() { 
    public void doWith(Method method) { 
     RequestMapping mapping = AnnotationUtils.findAnnotation(
            method, RequestMapping.class); 
     if (mapping != null) { 
      String[] mappedPatterns = mapping.value(); 
      if (mappedPatterns.length > 0) { 
       for (String mappedPattern : mappedPatterns) { 
        // this is where Expression Language would be parsed 
        // but it isn't, as you can see 
        if (!hasTypeLevelMapping && !mappedPattern.startsWith("/")) { 
         mappedPattern = "/" + mappedPattern; 
        } 
        addUrlsForPath(urls, mappedPattern); 
       } 
      } 
      else if (hasTypeLevelMapping) { 
       urls.add(null); 
      } 
     } 
    } 
}, ReflectionUtils.USER_DECLARED_METHODS); 

請記住,這就是所謂的開源。如果您不試圖瞭解您使用的是什麼,那麼使用開放源代碼軟件沒有意義。

+6

謝謝你的答案,但請保存你的蔑視,你不知道什麼海報已經嘗試過或沒有嘗試過 – chrismarx 2010-09-27 18:31:35

+2

@chris真實的,不要採取這個人,要麼。 SO答案針對的不僅僅是OP中的更多觀衆。我正在做一個普遍的觀察,你的情況可能是不合理的 – 2010-09-27 18:41:56

+0

最後一行=純金。 – 2013-12-10 11:14:08

相關問題