Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define order of method interceptors in Guice?

Sometimes there's a need to know the order of method interceptors that intercept a method call in Guice. A simple example scenario would be to use guice-persist provided @Transactional method interceptor with a custom @Retry method interceptor. The retry interceptor must be run outside of the transactional interceptor to make sure the retries are not executed within the same transaction.

In Spring you could use the Ordered interface for the interceptor to make sure the transaction interceptor is executed within the retry interceptor. Is there a way to achieve the same in Guice?

like image 516
tautonen Avatar asked Nov 29 '11 09:11

tautonen


1 Answers

Guice invokes the interceptors in the order in which they were registered. So if you define them something like this:

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

or

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

the retryInterceptor will be executed before the transactionalInterceptor.

Same applies if you have multiple modules - the interceptors from first module are executed before the interceptors of the seconds module and so on.

like image 200
Geno Roupsky Avatar answered Dec 09 '22 18:12

Geno Roupsky