From 9083da2876d864dcf01033d1447ad37395781765 Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Beaudet Date: Wed, 7 Aug 2019 12:22:48 -0400 Subject: [PATCH 1/2] Fix annotation lookup on proxied EndpointExtension See gh-17807 --- .../annotation/EndpointDiscoverer.java | 4 +-- .../annotation/EndpointDiscovererTests.java | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) 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..732bbf50be 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; @@ -112,6 +114,15 @@ public class EndpointDiscovererTests { load(TestEndpointConfiguration.class, this::hasTestEndpoint); } + @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 getEndpointsWhenHasEndpointInParentContextShouldReturnEndpoint() { AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext( @@ -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 { @@ -377,6 +401,11 @@ public class EndpointDiscovererTests { } + @Import({ TestEndpoint.class, ProxiedSpecializedTestEndpointConfiguration.class, SpecializedTestEndpoint.class }) + static class ProxiedSpecializedEndpointsConfiguration { + + } + @Import({ TestEndpoint.class, SpecializedTestEndpoint.class, SpecializedExtension.class }) static class SpecializedEndpointsConfiguration { From 994f08d23449d779c8aa89ba5933f6ad7e5d3d1e Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 8 Aug 2019 13:58:03 +0200 Subject: [PATCH 2/2] Polish "Fix annotation lookup on proxied EndpointExtension" See gh-17807 --- .../annotation/EndpointDiscovererTests.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) 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 732bbf50be..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 @@ -114,15 +114,6 @@ public class EndpointDiscovererTests { load(TestEndpointConfiguration.class, this::hasTestEndpoint); } - @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 getEndpointsWhenHasEndpointInParentContextShouldReturnEndpoint() { AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext( @@ -247,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) -> { @@ -401,11 +401,6 @@ public class EndpointDiscovererTests { } - @Import({ TestEndpoint.class, ProxiedSpecializedTestEndpointConfiguration.class, SpecializedTestEndpoint.class }) - static class ProxiedSpecializedEndpointsConfiguration { - - } - @Import({ TestEndpoint.class, SpecializedTestEndpoint.class, SpecializedExtension.class }) static class SpecializedEndpointsConfiguration { @@ -416,6 +411,11 @@ public class EndpointDiscovererTests { } + @Import({ TestEndpoint.class, SpecializedTestEndpoint.class, ProxiedSpecializedTestEndpointConfiguration.class }) + static class ProxiedSpecializedEndpointsConfiguration { + + } + @Endpoint(id = "test") static class TestEndpoint {