diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscoverer.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscoverer.java index f6fcab1ab6..a1ff0f54af 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscoverer.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscoverer.java @@ -469,8 +469,8 @@ public abstract class EndpointDiscoverer, O exten ExtensionBean(String beanName, Object bean) { this.bean = bean; this.beanName = beanName; - AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(bean.getClass(), - EndpointExtension.class); + AnnotationAttributes attributes = AnnotatedElementUtils.findMergedAnnotationAttributes(bean.getClass(), + EndpointExtension.class, false, true); Class endpointType = attributes.getClass("endpoint"); AnnotationAttributes endpointAttributes = AnnotatedElementUtils.findMergedAnnotationAttributes(endpointType, Endpoint.class, true, true); diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscovererTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscovererTests.java index 77b9b04175..94a8f065ec 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscovererTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscovererTests.java @@ -44,6 +44,8 @@ import org.springframework.boot.actuate.endpoint.invoke.ParameterValueMapper; import org.springframework.boot.actuate.endpoint.invoke.convert.ConversionServiceParameterValueMapper; import org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvoker; import org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor; +import org.springframework.cglib.proxy.Enhancer; +import org.springframework.cglib.proxy.FixedValue; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; @@ -236,6 +238,15 @@ public class EndpointDiscovererTests { }); } + @Test + public void getEndpointsWhenHasProxiedEndpointShouldReturnEndpoint() { + load(ProxiedSpecializedEndpointsConfiguration.class, (context) -> { + SpecializedEndpointDiscoverer discoverer = new SpecializedEndpointDiscoverer(context); + Map endpoints = mapEndpoints(discoverer.getEndpoints()); + assertThat(endpoints).containsOnlyKeys(EndpointId.of("test"), EndpointId.of("specialized")); + }); + } + @Test public void getEndpointsShouldApplyFilters() { load(SpecializedEndpointsConfiguration.class, (context) -> { @@ -327,6 +338,19 @@ public class EndpointDiscovererTests { } + @Configuration + static class ProxiedSpecializedTestEndpointConfiguration { + + @Bean + public SpecializedExtension specializedExtension() { + Enhancer enhancer = new Enhancer(); + enhancer.setSuperclass(SpecializedExtension.class); + enhancer.setCallback((FixedValue) () -> null); + return (SpecializedExtension) enhancer.create(); + } + + } + @Configuration static class TestEndpointConfiguration { @@ -387,6 +411,11 @@ public class EndpointDiscovererTests { } + @Import({ TestEndpoint.class, SpecializedTestEndpoint.class, ProxiedSpecializedTestEndpointConfiguration.class }) + static class ProxiedSpecializedEndpointsConfiguration { + + } + @Endpoint(id = "test") static class TestEndpoint {