2011-11-29 7 views
8

A veces es necesario conocer el orden de los interceptores de métodos que interceptan una llamada a un método en Guice. Un escenario de ejemplo simple sería usar el interceptor de método @Transactional proporcionado por guice-persist con un interceptor de método @Retry personalizado. El interceptor de reintentos debe ejecutarse fuera del interceptor transaccional para asegurarse de que los reintentos no se ejecuten dentro de la misma transacción.¿Cómo se define el orden de los interceptores de métodos en Guice?

En Spring, puede usar la interfaz ordenada para el interceptor para asegurarse de que el interceptor de transacción se ejecuta dentro del interceptor de reintentos. ¿Hay alguna manera de lograr lo mismo en Guice?

Respuesta

15

Guice invoca los interceptores en el orden en que se registraron. Así que si los define así:

bindInterceptor(any(), annotatedWith(Retry.class), retryInterceptor); 
bindInterceptor(any(), annotatedWith(Transactional.class), transactionalInterceptor); 

o

bindInterceptor(any(), annotatedWith(Retry.class), retryInterceptor, transactionalInterceptor); 

la retryInterceptor se ejecutará antes de la transactionalInterceptor.

Lo mismo se aplica si tiene múltiples módulos: los interceptores del primer módulo se ejecutan antes que los interceptores del módulo de segundos, y así sucesivamente.

+0

Es un enfoque muy limitado. Si tiene un módulo que configura algunos interceptores y necesita instalar este módulo y configurar un interceptor adicional entre los instalados por el módulo, no hay forma de hacerlo. – BrunoJCM

Cuestiones relacionadas