|
17 | 17 | package org.springframework.retry.annotation;
|
18 | 18 |
|
19 | 19 | import java.lang.reflect.Method;
|
| 20 | +import java.lang.reflect.ParameterizedType; |
20 | 21 | import java.util.HashMap;
|
21 | 22 | import java.util.Map;
|
22 | 23 |
|
@@ -173,27 +174,34 @@ public void doWith(Method method) throws IllegalArgumentException, IllegalAccess
|
173 | 174 | if (recover == null) {
|
174 | 175 | recover = findAnnotationOnTarget(target, method);
|
175 | 176 | }
|
176 |
| - if (recover != null && method.getReturnType().isAssignableFrom(failingMethod.getReturnType())) { |
177 |
| - Class<?>[] parameterTypes = method.getParameterTypes(); |
178 |
| - if (parameterTypes.length > 0 && Throwable.class.isAssignableFrom(parameterTypes[0])) { |
179 |
| - @SuppressWarnings("unchecked") |
180 |
| - Class<? extends Throwable> type = (Class<? extends Throwable>) parameterTypes[0]; |
181 |
| - types.put(type, method); |
182 |
| - RecoverAnnotationRecoveryHandler.this.methods.put(method, |
183 |
| - new SimpleMetadata(parameterTypes.length, type)); |
184 |
| - } |
185 |
| - else { |
186 |
| - RecoverAnnotationRecoveryHandler.this.classifier.setDefaultValue(method); |
187 |
| - RecoverAnnotationRecoveryHandler.this.methods.put(method, |
188 |
| - new SimpleMetadata(parameterTypes.length, null)); |
| 177 | + if (recover != null && failingMethod.getGenericReturnType() instanceof ParameterizedType) { |
| 178 | + if (method.getGenericReturnType().equals(failingMethod.getGenericReturnType())) { |
| 179 | + putToMethodsMap(method, types); |
189 | 180 | }
|
190 | 181 | }
|
| 182 | + else if (recover != null && method.getReturnType().isAssignableFrom(failingMethod.getReturnType())) { |
| 183 | + putToMethodsMap(method, types); |
| 184 | + } |
191 | 185 | }
|
192 | 186 | });
|
193 | 187 | this.classifier.setTypeMap(types);
|
194 | 188 | optionallyFilterMethodsBy(failingMethod.getReturnType());
|
195 | 189 | }
|
196 | 190 |
|
| 191 | + private void putToMethodsMap(Method method, Map<Class<? extends Throwable>, Method> types) { |
| 192 | + Class<?>[] parameterTypes = method.getParameterTypes(); |
| 193 | + if (parameterTypes.length > 0 && Throwable.class.isAssignableFrom(parameterTypes[0])) { |
| 194 | + @SuppressWarnings("unchecked") |
| 195 | + Class<? extends Throwable> type = (Class<? extends Throwable>) parameterTypes[0]; |
| 196 | + types.put(type, method); |
| 197 | + RecoverAnnotationRecoveryHandler.this.methods.put(method, new SimpleMetadata(parameterTypes.length, type)); |
| 198 | + } |
| 199 | + else { |
| 200 | + RecoverAnnotationRecoveryHandler.this.classifier.setDefaultValue(method); |
| 201 | + RecoverAnnotationRecoveryHandler.this.methods.put(method, new SimpleMetadata(parameterTypes.length, null)); |
| 202 | + } |
| 203 | + } |
| 204 | + |
197 | 205 | private Recover findAnnotationOnTarget(Object target, Method method) {
|
198 | 206 | try {
|
199 | 207 | Method targetMethod = target.getClass().getMethod(method.getName(), method.getParameterTypes());
|
|
0 commit comments