2010-07-19 18 views
6

Voglio essere in grado di fare questo:possiamo usare le espressioni primaverili (spel) in altre annotazioni?

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

questo non sembra funzionare ora, mi sto perdendo qualcosa?

+0

Per chiarire, l'espressione spel funziona bene con l'annotazione @value per impostare il valore di "RESOURCE_FOLDER", ma non funziona nel @ RequestMapping annotation – chrismarx

risposta

0

@Sean ha risposto alla domanda se Spring supportava questo, ma volevo anche rispondere alla domanda di solo in generale come non duplicare la configurazione quando si usano le annotazioni. Si scopre che questo è possibile utilizzando le importazioni statiche, come in:

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

Un modo per scoprire cose come questa è guardare da soli. Questo è un esempio per Eclipse, ma dovrebbe funzionare in modo simile per altri IDE:

Prima di tutto, assicurarsi di disporre delle sorgenti delle librerie di molle che si stanno utilizzando. Questo è più semplice se si utilizza Maven, using the maven-eclipse-plugin o m2eclipse.

Quindi, in Eclipse selezionare Navigate -> Open Type.... Inserisci il tipo che stai cercando (qualcosa come RequestMa* dovrebbe fare per i dattilografi pigri come me). Inserisci/OK. Ora fai clic con il tasto destro del mouse sul nome della classe nel file sorgente e seleziona References -> Project. Nella vista di ricerca, verranno visualizzati tutti gli usi di questa classe o annotazione.

Uno di loro è DefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods(Class, boolean), dove questo frammento di codice vi dirà che il linguaggio di espressione non viene valutata:

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

Ricordate, si chiama Open Source. Non ha senso usare il software Open Source se non provi a capire cosa stai usando.

+6

grazie per la risposta, ma per favore salva la tua denigrazione, non hai idea di cosa abbia provato o meno un poster- – chrismarx

+2

@chris Vero, e non prendertela personalmente. Le risposte SO sono rivolte a un pubblico più vasto rispetto al solo OP. Stavo facendo un'osservazione generale che forse era ingiustificata nel tuo caso –

+0

ultima riga = puro ORO. !! –

Problemi correlati