Consider annotated methods in AnnotationRevisionMetadata.
We now detect annotated methods. Closes #2569
This commit is contained in:
committed by
Jens Schauder
parent
8e241b1938
commit
6bc28c118c
@@ -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));
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user