Commit ed50bf24 authored by Andy Wilkinson's avatar Andy Wilkinson

Honour EndpointFilter configured on an endpoint's superclass

Previously, @EndpointFilter would only have an effect when used as
an annotation or meta-annotation on the endpoint class itself. It
would have no effect when used on a super-class of the endpoint
bean's class.

This commit updates EndpointDiscoverer so that an @EndpointFilter
annotation or meta-annotation on a super-class will be found and
applied to the discovery process. This is achieved by using find…
rather than get… when retrieving the attributes for the EndpointFilter
annotation.

Fixes gh-17866
parent cb76502a
...@@ -423,8 +423,8 @@ public abstract class EndpointDiscoverer<E extends ExposableEndpoint<O>, O exten ...@@ -423,8 +423,8 @@ public abstract class EndpointDiscoverer<E extends ExposableEndpoint<O>, O exten
} }
private Class<?> getFilter(Class<?> type) { private Class<?> getFilter(Class<?> type) {
AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(type, AnnotationAttributes attributes = AnnotatedElementUtils.findMergedAnnotationAttributes(type,
FilteredEndpoint.class); FilteredEndpoint.class, false, true);
if (attributes == null) { if (attributes == null) {
return null; return null;
} }
......
...@@ -209,7 +209,8 @@ public class EndpointDiscovererTests { ...@@ -209,7 +209,8 @@ public class EndpointDiscovererTests {
load(SpecializedEndpointsConfiguration.class, (context) -> { load(SpecializedEndpointsConfiguration.class, (context) -> {
SpecializedEndpointDiscoverer discoverer = new SpecializedEndpointDiscoverer(context); SpecializedEndpointDiscoverer discoverer = new SpecializedEndpointDiscoverer(context);
Map<EndpointId, SpecializedExposableEndpoint> endpoints = mapEndpoints(discoverer.getEndpoints()); Map<EndpointId, SpecializedExposableEndpoint> endpoints = mapEndpoints(discoverer.getEndpoints());
assertThat(endpoints).containsOnlyKeys(EndpointId.of("test"), EndpointId.of("specialized")); assertThat(endpoints).containsOnlyKeys(EndpointId.of("test"), EndpointId.of("specialized"),
EndpointId.of("specialized-superclass"));
}); });
} }
...@@ -252,7 +253,7 @@ public class EndpointDiscovererTests { ...@@ -252,7 +253,7 @@ public class EndpointDiscovererTests {
load(SpecializedEndpointsConfiguration.class, (context) -> { load(SpecializedEndpointsConfiguration.class, (context) -> {
EndpointFilter<SpecializedExposableEndpoint> filter = (endpoint) -> { EndpointFilter<SpecializedExposableEndpoint> filter = (endpoint) -> {
EndpointId id = endpoint.getEndpointId(); EndpointId id = endpoint.getEndpointId();
return !id.equals(EndpointId.of("specialized")); return !id.equals(EndpointId.of("specialized")) && !id.equals(EndpointId.of("specialized-superclass"));
}; };
SpecializedEndpointDiscoverer discoverer = new SpecializedEndpointDiscoverer(context, SpecializedEndpointDiscoverer discoverer = new SpecializedEndpointDiscoverer(context,
Collections.singleton(filter)); Collections.singleton(filter));
...@@ -401,7 +402,8 @@ public class EndpointDiscovererTests { ...@@ -401,7 +402,8 @@ public class EndpointDiscovererTests {
} }
@Import({ TestEndpoint.class, SpecializedTestEndpoint.class, SpecializedExtension.class }) @Import({ TestEndpoint.class, SpecializedTestEndpoint.class, SpecializedSuperclassTestEndpoint.class,
SpecializedExtension.class })
static class SpecializedEndpointsConfiguration { static class SpecializedEndpointsConfiguration {
} }
...@@ -494,6 +496,20 @@ public class EndpointDiscovererTests { ...@@ -494,6 +496,20 @@ public class EndpointDiscovererTests {
} }
@SpecializedEndpoint(id = "specialized-superclass")
static class AbstractFilteredEndpoint {
}
static class SpecializedSuperclassTestEndpoint extends AbstractFilteredEndpoint {
@ReadOperation
public Object getAll() {
return null;
}
}
static class SubSpecializedTestEndpoint extends SpecializedTestEndpoint { static class SubSpecializedTestEndpoint extends SpecializedTestEndpoint {
@ReadOperation @ReadOperation
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment