2012-02-03 32 views
10

¿Alguien puede explicar lo que debo hacer para implementar mi propia anotación que agregaría funcionalidad a mis solicitudes web?¿Cómo agregar una anotación personalizada a Spring MVC?

Por ejemplo:

@Controller 
public class MyController { 
    @RequestMapping("/abc") 
    @RequiresSomeSpecialHandling 
    public void handleSecureRequest() { 
    } 
} 

Aquí @RequiresSomeSpecialHandling sería mi propia anotación que hace un trabajo especial para hacerse antes o después de la solicitud web determinada /abc.

Sé que en un nivel muy alto tendría que escribir un postprocesador de frijol, escanear las clases para mis anotaciones e inyectar interceptores de mvc personalizados cuando sea necesario. ¿Pero hay algunos atajos para simplificar esta tarea? Especialmente para los dos ejemplos anteriores.

Gracias de antemano,

+1

BTW: Si "@RequiresAuth" es solo un ejemplo, entonces es bueno, pero no reinventar la seguridad de primavera – Ralph

+0

Fue solo un ejemplo: edité mi publicación para hacer el ejemplo más genérico. – rustyx

Respuesta

2

Depende de lo que quieras hacer como resultado de @RequiresSomeSpecialHandling. P.ej. ¿Desea que influya en las asignaciones de solicitudes o en la invocación del método (es decir, resolver argumentos de métodos, procesar el valor de retorno)?

El soporte para clases anotadas en Spring 3.1 se volvió mucho más personalizable. Puede buscar algunos ejemplos en this repo.

También tenga en cuenta que un HandlerInterceptor en Spring 3.1 puede convertir el HandlerMethod del manejador, que le da acceso al método exacto, incluidas sus anotaciones. Eso puede ser suficiente para lo que necesita hacer.

4

Este tipo de anotaciones, (que añaden funcionalidad adicional cuando se invoca un método) se parece a las anotaciones que desencadenan un Consejo de AOP.

@see primavera Reference Chapter 7. Aspect Oriented Programming with Spring


La idea es utilizar la anotación para disparar el Consejo de AOP.

gustan:

@Pointcut("@target(com.example.RequiresAuth)") 
+0

Gracias. Sí, AOP está en mi lista, pero me gustaría tratar de hacer una anotación y volver a utilizar tantas instalaciones de MVC como sea posible. – rustyx

+0

@rustyx: Sí, esa era la idea detrás: use la Anotación para activar el Asesoramiento AOP, vea mi respuesta extendida para ilustrarlo. – Ralph

+0

Encuentro '@ annotation' para ser útil en la escritura de expresiones puntuales. –

-2

Si la caché es uno de sus objetivos, echar un vistazo a la @Cacheable anotación (y sus hermanos @CachePut, @CacheEvict y @Caching), disponible a partir de la primavera 3,1.

+0

Lo siento, su respuesta es inútil para mí. La anotación @NoCache en mi ejemplo se refería a HTTP no-cache, no a la caché de métodos, y de todos modos solo era un ejemplo. – rustyx

Cuestiones relacionadas