2010-07-19 30 views
6

Quiero ser capaz de hacer esto:¿podemos usar expresiones de primavera (spel) en otras anotaciones?

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

esto no parece funcionar ahora, me estoy perdiendo algo?

+0

para aclarar, la expresión o juego funciona muy bien con la anotación @value para ajustar el valor de "RESOURCE_FOLDER", pero no va a trabajar en el @ Asignación de la solicitud Anotación – chrismarx

Respuesta

0

@Sean respondió la pregunta de si Spring admitió esto, pero también quería responder a la pregunta de cómo generalmente no duplicar la configuración cuando se usan anotaciones. Resulta que esto es posible usando las importaciones estáticas, como en:

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

Una forma de descubrir este tipo de cosas es echarle un vistazo. Este es un ejemplo de eclipse, pero debería funcionar de manera similar para otros IDEs:

Antes que nada, asegúrese de tener las fuentes de las bibliotecas de resortes que está utilizando. Esto es más fácil si usa maven, using the maven-eclipse-plugin o usando m2eclipse.

Luego, en Eclipse, seleccione Navigate -> Open Type.... Ingrese el tipo que está buscando (algo como RequestMa* debería hacer para los creadores de tipos perezosos como yo). Entrar/Aceptar. Ahora haga clic derecho en el nombre de la clase en el archivo fuente y seleccione References -> Project. En la vista de búsqueda, aparecerán todos los usos de esta clase o anotación.

Uno de ellos es DefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods(Class, boolean), donde este fragmento de código le dirá que el lenguaje de expresión no se evalúa:

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

Recuerde, se llama Open Source. No tiene sentido utilizar el software de código abierto si no intenta comprender lo que está utilizando.

+6

gracias por la respuesta, pero por favor guarde su menosprecio, no tiene idea de lo que un cartel ha intentado o no intentado- – chrismarx

+2

@chris Cierto, y no tome esto personalmente, tampoco. Las respuestas SO están dirigidas a un público más amplio que solo el OP. Estaba haciendo una observación general que tal vez no estaba justificada en su caso –

+0

última línea = ORO puro. !! –

Cuestiones relacionadas