@@ -173,7 +173,7 @@ private MethodInterceptor getDelegate(Object target, Method method) {
173173 MethodInterceptor interceptor = NULL_INTERCEPTOR ;
174174 Retryable retryable = AnnotatedElementUtils .findMergedAnnotation (method , Retryable .class );
175175 if (retryable == null ) {
176- retryable = AnnotatedElementUtils . findMergedAnnotation (method . getDeclaringClass () , Retryable .class );
176+ retryable = classLevelAnnotation (method , Retryable .class );
177177 }
178178 if (retryable == null ) {
179179 retryable = findAnnotationOnTarget (target , method , Retryable .class );
@@ -202,7 +202,7 @@ private <A extends Annotation> A findAnnotationOnTarget(Object target, Method me
202202 Method targetMethod = target .getClass ().getMethod (method .getName (), method .getParameterTypes ());
203203 A retryable = AnnotatedElementUtils .findMergedAnnotation (targetMethod , annotation );
204204 if (retryable == null ) {
205- retryable = AnnotatedElementUtils . findMergedAnnotation (targetMethod . getDeclaringClass () , annotation );
205+ retryable = classLevelAnnotation (targetMethod , annotation );
206206 }
207207
208208 return retryable ;
@@ -212,6 +212,17 @@ private <A extends Annotation> A findAnnotationOnTarget(Object target, Method me
212212 }
213213 }
214214
215+ /*
216+ * With a class level annotation, exclude @Recover methods.
217+ */
218+ private <A extends Annotation > A classLevelAnnotation (Method method , Class <A > annotation ) {
219+ A ann = AnnotatedElementUtils .findMergedAnnotation (method .getDeclaringClass (), annotation );
220+ if (ann != null && AnnotatedElementUtils .findMergedAnnotation (method , Recover .class ) != null ) {
221+ ann = null ;
222+ }
223+ return ann ;
224+ }
225+
215226 private MethodInterceptor getStatelessInterceptor (Object target , Method method , Retryable retryable ) {
216227 RetryTemplate template = createTemplate (retryable .listeners ());
217228 template .setRetryPolicy (getRetryPolicy (retryable ));
@@ -316,9 +327,9 @@ private MethodInvocationRecoverer<?> getRecoverer(Object target, Method method)
316327 return (MethodInvocationRecoverer <?>) target ;
317328 }
318329 final AtomicBoolean foundRecoverable = new AtomicBoolean (false );
319- ReflectionUtils .doWithMethods (target .getClass (), new MethodCallback () {
330+ ReflectionUtils .doWithMethods (target .getClass (), new ReflectionUtils . MethodCallback () {
320331 @ Override
321- public void doWith (Method method ) throws IllegalArgumentException , IllegalAccessException {
332+ public void doWith (Method method ) throws IllegalArgumentException {
322333 if (AnnotatedElementUtils .findMergedAnnotation (method , Recover .class ) != null ) {
323334 foundRecoverable .set (true );
324335 }
0 commit comments