Skip to content

Commit 9083da2

Browse files
jebeaudetsnicoll
authored andcommitted
Fix annotation lookup on proxied EndpointExtension
See gh-17807
1 parent 5216574 commit 9083da2

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscoverer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -469,8 +469,8 @@ private static class ExtensionBean {
469469
ExtensionBean(String beanName, Object bean) {
470470
this.bean = bean;
471471
this.beanName = beanName;
472-
AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(bean.getClass(),
473-
EndpointExtension.class);
472+
AnnotationAttributes attributes = AnnotatedElementUtils.findMergedAnnotationAttributes(bean.getClass(),
473+
EndpointExtension.class, false, true);
474474
Class<?> endpointType = attributes.getClass("endpoint");
475475
AnnotationAttributes endpointAttributes = AnnotatedElementUtils.findMergedAnnotationAttributes(endpointType,
476476
Endpoint.class, true, true);

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/EndpointDiscovererTests.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
import org.springframework.boot.actuate.endpoint.invoke.convert.ConversionServiceParameterValueMapper;
4545
import org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvoker;
4646
import org.springframework.boot.actuate.endpoint.invoker.cache.CachingOperationInvokerAdvisor;
47+
import org.springframework.cglib.proxy.Enhancer;
48+
import org.springframework.cglib.proxy.FixedValue;
4749
import org.springframework.context.ApplicationContext;
4850
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
4951
import org.springframework.context.annotation.Bean;
@@ -112,6 +114,15 @@ public void getEndpointsWhenHasEndpointShouldReturnEndpoint() {
112114
load(TestEndpointConfiguration.class, this::hasTestEndpoint);
113115
}
114116

117+
@Test
118+
public void getEndpointsWhenHasProxiedEndpointShouldReturnEndpoint() {
119+
load(ProxiedSpecializedEndpointsConfiguration.class, (context) -> {
120+
SpecializedEndpointDiscoverer discoverer = new SpecializedEndpointDiscoverer(context);
121+
Map<EndpointId, SpecializedExposableEndpoint> endpoints = mapEndpoints(discoverer.getEndpoints());
122+
assertThat(endpoints).containsOnlyKeys(EndpointId.of("test"), EndpointId.of("specialized"));
123+
});
124+
}
125+
115126
@Test
116127
public void getEndpointsWhenHasEndpointInParentContextShouldReturnEndpoint() {
117128
AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(
@@ -327,6 +338,19 @@ static class EmptyConfiguration {
327338

328339
}
329340

341+
@Configuration
342+
static class ProxiedSpecializedTestEndpointConfiguration {
343+
344+
@Bean
345+
public SpecializedExtension specializedExtension() {
346+
Enhancer enhancer = new Enhancer();
347+
enhancer.setSuperclass(SpecializedExtension.class);
348+
enhancer.setCallback((FixedValue) () -> null);
349+
return (SpecializedExtension) enhancer.create();
350+
}
351+
352+
}
353+
330354
@Configuration
331355
static class TestEndpointConfiguration {
332356

@@ -377,6 +401,11 @@ public TestEndpoint scopedTargetTestEndpoint() {
377401

378402
}
379403

404+
@Import({ TestEndpoint.class, ProxiedSpecializedTestEndpointConfiguration.class, SpecializedTestEndpoint.class })
405+
static class ProxiedSpecializedEndpointsConfiguration {
406+
407+
}
408+
380409
@Import({ TestEndpoint.class, SpecializedTestEndpoint.class, SpecializedExtension.class })
381410
static class SpecializedEndpointsConfiguration {
382411

0 commit comments

Comments
 (0)