2010-07-19 11 views
6

Chcę móc to zrobić:Czy możemy używać wyrażeń sprężystych (spel) w innych adnotacjach?

@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"; 
    } 
} 

ten nie wydaje się działać teraz, ja czegoś brakuje?

+0

wyjaśnienie wyrażenie Spel działa dobrze z @value adnotacji o ustawienie wartości „RESOURCE_FOLDER”, ale to nie będzie działać w @ RequestMapping adnotacja – chrismarx

Odpowiedz

0

@Sean odpowiedział na pytanie, czy wiosna to popiera, ale chciałem również odpowiedzieć na pytanie, jak ogólnie nie duplikować konfiguracji podczas korzystania z adnotacji. Okazuje się to możliwe przy użyciu importu statycznych, jak w:

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

Jednym ze sposobów, aby dowiedzieć się czegoś takiego, jest spojrzenie na siebie. Jest to przykład na zaćmienie, ale powinno działać podobnie do innych IDE:

Przede wszystkim upewnij się, że masz źródła bibliotek wiosennych, których używasz. Jest to najłatwiejsze, jeśli używasz maven, using the maven-eclipse-plugin lub używasz m2eclipse.

Następnie, w Eclipse wybierz Navigate -> Open Type.... Wpisz typ, którego szukasz (coś w stylu RequestMa* powinno zrobić dla leniwych typerów, takich jak ja). Wprowadź/OK. Teraz kliknij prawym przyciskiem myszy nazwę klasy w pliku źródłowym i wybierz opcję References -> Project. W widoku wyszukiwania pojawią się wszystkie zastosowania tej klasy lub adnotacji.

Jednym z nich jest DefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods(Class, boolean), gdzie ten fragment kodu będzie powiedzieć, że język nie jest oceniany wyrażenie:

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

Pamiętaj, że nazywa się Open Source. Nie ma sensu używać oprogramowania Open Source, jeśli nie próbujesz zrozumieć, z czego korzystasz.

+6

dziękuję za odpowiedź, ale proszę, zachowaj swój dyskredytacji, nie masz pojęcia, co plakatu próbował lub nie próbowałem- – chrismarx

+2

@chris To prawda, i nie bierz tego osobiście, albo. Odpowiedzi SO są skierowane do większej grupy odbiorców niż tylko PO. Robiłem ogólną obserwację, która być może była nieuzasadniona w twoim przypadku. –

+0

ostatnia linia = czysta ZŁOTA !! –

Powiązane problemy