tautonen
tautonen

Reputation: 193

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?

Upvotes: 11

Views: 3203

Answers (1)

Geno Roupsky
Geno Roupsky

Reputation: 646

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.

Upvotes: 20

Related Questions