Consider annotated methods in AnnotationRevisionMetadata.

We now detect annotated methods.

Closes #2569
This commit is contained in:
Mark Paluch
2022-03-02 14:22:30 +01:00
committed by Jens Schauder
parent 8e241b1938
commit 6bc28c118c
3 changed files with 47 additions and 1 deletions

View File

@@ -23,6 +23,7 @@ import java.util.Date;
import java.util.Optional;
import org.springframework.data.util.AnnotationDetectionFieldCallback;
import org.springframework.data.util.AnnotationDetectionMethodCallback;
import org.springframework.data.util.Lazy;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
@@ -34,6 +35,7 @@ import org.springframework.util.ReflectionUtils;
*
* @author Oliver Gierke
* @author Jens Schauder
* @author Mark Paluch
*/
public class AnnotationRevisionMetadata<N extends Number & Comparable<N>> implements RevisionMetadata<N> {
@@ -98,11 +100,19 @@ public class AnnotationRevisionMetadata<N extends Number & Comparable<N>> implem
return (T) entity;
}
@SuppressWarnings("unchecked")
private static <T> Lazy<Optional<T>> detectAnnotation(Object entity, Class<? extends Annotation> annotationType) {
return Lazy.of(() -> {
var callback = new AnnotationDetectionFieldCallback(annotationType);
AnnotationDetectionMethodCallback<? extends Annotation> methodCallback = new AnnotationDetectionMethodCallback<>(
annotationType);
ReflectionUtils.doWithMethods(entity.getClass(), methodCallback);
if (methodCallback.getMethod() != null) {
return Optional.ofNullable((T) ReflectionUtils.invokeMethod(methodCallback.getRequiredMethod(), entity));
}
AnnotationDetectionFieldCallback callback = new AnnotationDetectionFieldCallback(annotationType);
ReflectionUtils.doWithFields(entity.getClass(), callback);
return Optional.ofNullable(callback.getValue(entity));
});

View File

@@ -21,6 +21,7 @@ import java.lang.reflect.Method;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.ReflectionUtils.MethodCallback;
/**
@@ -28,6 +29,7 @@ import org.springframework.util.ReflectionUtils.MethodCallback;
*
* @author Oliver Gierke
* @author Christoph Strobl
* @author Mark Paluch
*/
public class AnnotationDetectionMethodCallback<A extends Annotation> implements MethodCallback {
@@ -121,6 +123,8 @@ public class AnnotationDetectionMethodCallback<A extends Annotation> implements
}
this.annotation = foundAnnotation;
ReflectionUtils.makeAccessible(method);
this.foundMethod = method;
}
}