Skip to content

Commit 24a52aa

Browse files
committed
Annotate actuator internal infrastructure with @Reflective
This commit simplifies the registration of hints for the infrastructure of the Actuator that is invoked via reflection.
1 parent 6d6270e commit 24a52aa

File tree

6 files changed

+38
-40
lines changed

6 files changed

+38
-40
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/CloudFoundryWebFluxEndpointHandlerMapping.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive;
1818

19-
import java.lang.reflect.Method;
2019
import java.util.Collection;
2120
import java.util.Collections;
2221
import java.util.LinkedHashMap;
@@ -28,6 +27,8 @@
2827

2928
import org.springframework.aot.hint.RuntimeHints;
3029
import org.springframework.aot.hint.RuntimeHintsRegistrar;
30+
import org.springframework.aot.hint.annotation.Reflective;
31+
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
3132
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.AccessLevel;
3233
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.SecurityResponse;
3334
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive.CloudFoundryWebFluxEndpointHandlerMapping.CloudFoundryWebFluxEndpointHandlerMappingRuntimeHints;
@@ -44,8 +45,6 @@
4445
import org.springframework.http.HttpStatus;
4546
import org.springframework.http.ResponseEntity;
4647
import org.springframework.http.server.reactive.ServerHttpRequest;
47-
import org.springframework.util.Assert;
48-
import org.springframework.util.ReflectionUtils;
4948
import org.springframework.web.cors.CorsConfiguration;
5049
import org.springframework.web.reactive.result.method.RequestMappingInfoHandlerMapping;
5150
import org.springframework.web.server.ServerWebExchange;
@@ -88,6 +87,7 @@ protected LinksHandler getLinksHandler() {
8887
class CloudFoundryLinksHandler implements LinksHandler {
8988

9089
@Override
90+
@Reflective
9191
public Publisher<ResponseEntity<Object>> links(ServerWebExchange exchange) {
9292
ServerHttpRequest request = exchange.getRequest();
9393
return CloudFoundryWebFluxEndpointHandlerMapping.this.securityInterceptor.preHandle(exchange, "")
@@ -156,14 +156,13 @@ private Mono<ResponseEntity<Object>> flatMapResponse(ServerWebExchange exchange,
156156

157157
static class CloudFoundryWebFluxEndpointHandlerMappingRuntimeHints implements RuntimeHintsRegistrar {
158158

159+
private final ReflectiveRuntimeHintsRegistrar reflectiveRegistrar = new ReflectiveRuntimeHintsRegistrar();
160+
159161
private final BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
160162

161163
@Override
162164
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
163-
Method linksMethod = ReflectionUtils.findMethod(CloudFoundryLinksHandler.class, "links",
164-
ServerWebExchange.class);
165-
Assert.state(linksMethod != null, "Unable to find 'links' method");
166-
hints.reflection().registerMethod(linksMethod);
165+
this.reflectiveRegistrar.registerRuntimeHints(hints, CloudFoundryLinksHandler.class);
167166
this.bindingRegistrar.registerReflectionHints(hints.reflection(), Link.class);
168167
}
169168

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryWebEndpointServletHandlerMapping.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet;
1818

19-
import java.lang.reflect.Method;
2019
import java.util.Collection;
2120
import java.util.Collections;
2221
import java.util.LinkedHashMap;
@@ -30,6 +29,8 @@
3029

3130
import org.springframework.aot.hint.RuntimeHints;
3231
import org.springframework.aot.hint.RuntimeHintsRegistrar;
32+
import org.springframework.aot.hint.annotation.Reflective;
33+
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
3334
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.AccessLevel;
3435
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.SecurityResponse;
3536
import org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet.CloudFoundryWebEndpointServletHandlerMapping.CloudFoundryWebEndpointServletHandlerMappingRuntimeHints;
@@ -45,8 +46,6 @@
4546
import org.springframework.context.aot.BindingReflectionHintsRegistrar;
4647
import org.springframework.http.HttpStatus;
4748
import org.springframework.http.ResponseEntity;
48-
import org.springframework.util.Assert;
49-
import org.springframework.util.ReflectionUtils;
5049
import org.springframework.web.bind.annotation.ResponseBody;
5150
import org.springframework.web.cors.CorsConfiguration;
5251
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
@@ -92,6 +91,7 @@ class CloudFoundryLinksHandler implements LinksHandler {
9291

9392
@Override
9493
@ResponseBody
94+
@Reflective
9595
public Map<String, Map<String, Link>> links(HttpServletRequest request, HttpServletResponse response) {
9696
SecurityResponse securityResponse = CloudFoundryWebEndpointServletHandlerMapping.this.securityInterceptor
9797
.preHandle(request, null);
@@ -158,14 +158,13 @@ public Object handle(HttpServletRequest request, Map<String, String> body) {
158158

159159
static class CloudFoundryWebEndpointServletHandlerMappingRuntimeHints implements RuntimeHintsRegistrar {
160160

161+
private final ReflectiveRuntimeHintsRegistrar reflectiveRegistrar = new ReflectiveRuntimeHintsRegistrar();
162+
161163
private final BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
162164

163165
@Override
164166
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
165-
Method linksMethod = ReflectionUtils.findMethod(CloudFoundryLinksHandler.class, "links",
166-
HttpServletRequest.class, HttpServletResponse.class);
167-
Assert.state(linksMethod != null, "Unable to find 'links' method");
168-
hints.reflection().registerMethod(linksMethod);
167+
this.reflectiveRegistrar.registerRuntimeHints(hints, CloudFoundryLinksHandler.class);
169168
this.bindingRegistrar.registerReflectionHints(hints.reflection(), Link.class);
170169
}
171170

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/AbstractWebFluxEndpointHandlerMapping.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
import org.springframework.aot.hint.RuntimeHints;
3434
import org.springframework.aot.hint.RuntimeHintsRegistrar;
35+
import org.springframework.aot.hint.annotation.Reflective;
36+
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
3537
import org.springframework.boot.actuate.endpoint.InvalidEndpointRequestException;
3638
import org.springframework.boot.actuate.endpoint.InvocationContext;
3739
import org.springframework.boot.actuate.endpoint.OperationArgumentResolver;
@@ -59,7 +61,6 @@
5961
import org.springframework.security.core.Authentication;
6062
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
6163
import org.springframework.util.AntPathMatcher;
62-
import org.springframework.util.Assert;
6364
import org.springframework.util.ClassUtils;
6465
import org.springframework.util.ReflectionUtils;
6566
import org.springframework.util.StringUtils;
@@ -410,6 +411,7 @@ private static final class WriteOperationHandler {
410411
}
411412

412413
@ResponseBody
414+
@Reflective
413415
Publisher<ResponseEntity<Object>> handle(ServerWebExchange exchange,
414416
@RequestBody(required = false) Map<String, String> body) {
415417
return this.operation.handle(exchange, body);
@@ -434,6 +436,7 @@ private static final class ReadOperationHandler {
434436
}
435437

436438
@ResponseBody
439+
@Reflective
437440
Publisher<ResponseEntity<Object>> handle(ServerWebExchange exchange) {
438441
return this.operation.handle(exchange, null);
439442
}
@@ -492,15 +495,12 @@ public boolean isUserInRole(String role) {
492495

493496
static class AbstractWebFluxEndpointHandlerMappingRuntimeHints implements RuntimeHintsRegistrar {
494497

498+
private final ReflectiveRuntimeHintsRegistrar reflectiveRegistrar = new ReflectiveRuntimeHintsRegistrar();
499+
495500
@Override
496501
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
497-
Method writeOperationHandleMethod = ReflectionUtils.findMethod(WriteOperationHandler.class, "handle",
498-
ServerWebExchange.class, Map.class);
499-
Assert.state(writeOperationHandleMethod != null, () -> "Unable to find write operation 'handle' method");
500-
Method readOperationHandleMethod = ReflectionUtils.findMethod(ReadOperationHandler.class, "handle",
501-
ServerWebExchange.class);
502-
Assert.state(readOperationHandleMethod != null, () -> "Unable to find read operation 'handle' method");
503-
hints.reflection().registerMethod(writeOperationHandleMethod).registerMethod(readOperationHandleMethod);
502+
this.reflectiveRegistrar.registerRuntimeHints(hints, WriteOperationHandler.class,
503+
ReadOperationHandler.class);
504504
}
505505

506506
}

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/WebFluxEndpointHandlerMapping.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616

1717
package org.springframework.boot.actuate.endpoint.web.reactive;
1818

19-
import java.lang.reflect.Method;
2019
import java.util.Collection;
2120
import java.util.Collections;
2221
import java.util.Map;
2322

2423
import org.springframework.aot.hint.RuntimeHints;
2524
import org.springframework.aot.hint.RuntimeHintsRegistrar;
25+
import org.springframework.aot.hint.annotation.Reflective;
26+
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
2627
import org.springframework.beans.factory.InitializingBean;
2728
import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
2829
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
@@ -32,8 +33,6 @@
3233
import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping.WebFluxEndpointHandlerMappingRuntimeHints;
3334
import org.springframework.context.annotation.ImportRuntimeHints;
3435
import org.springframework.context.aot.BindingReflectionHintsRegistrar;
35-
import org.springframework.util.Assert;
36-
import org.springframework.util.ReflectionUtils;
3736
import org.springframework.web.bind.annotation.ResponseBody;
3837
import org.springframework.web.cors.CorsConfiguration;
3938
import org.springframework.web.reactive.HandlerMapping;
@@ -84,6 +83,7 @@ class WebFluxLinksHandler implements LinksHandler {
8483

8584
@Override
8685
@ResponseBody
86+
@Reflective
8787
public Map<String, Map<String, Link>> links(ServerWebExchange exchange) {
8888
String requestUri = UriComponentsBuilder.fromUri(exchange.getRequest().getURI()).replaceQuery(null)
8989
.toUriString();
@@ -100,14 +100,13 @@ public String toString() {
100100

101101
static class WebFluxEndpointHandlerMappingRuntimeHints implements RuntimeHintsRegistrar {
102102

103+
private final ReflectiveRuntimeHintsRegistrar reflectiveRegistrar = new ReflectiveRuntimeHintsRegistrar();
104+
103105
private final BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
104106

105107
@Override
106108
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
107-
Method linksMethod = ReflectionUtils.findMethod(WebFluxLinksHandler.class, "links",
108-
ServerWebExchange.class);
109-
Assert.state(linksMethod != null, "Unable to find 'links' method");
110-
hints.reflection().registerMethod(linksMethod);
109+
this.reflectiveRegistrar.registerRuntimeHints(hints, WebFluxLinksHandler.class);
111110
this.bindingRegistrar.registerReflectionHints(hints.reflection(), Link.class);
112111
}
113112

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/servlet/AbstractWebMvcEndpointHandlerMapping.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
import org.springframework.aot.hint.RuntimeHints;
3636
import org.springframework.aot.hint.RuntimeHintsRegistrar;
37+
import org.springframework.aot.hint.annotation.Reflective;
38+
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
3739
import org.springframework.beans.factory.InitializingBean;
3840
import org.springframework.boot.actuate.endpoint.InvalidEndpointRequestException;
3941
import org.springframework.boot.actuate.endpoint.InvocationContext;
@@ -417,6 +419,7 @@ private static final class OperationHandler {
417419
}
418420

419421
@ResponseBody
422+
@Reflective
420423
Object handle(HttpServletRequest request, @RequestBody(required = false) Map<String, String> body) {
421424
return this.operation.handle(request, body);
422425
}
@@ -483,12 +486,11 @@ public boolean isUserInRole(String role) {
483486

484487
static class AbstractWebMvcEndpointHandlerMappingRuntimeHints implements RuntimeHintsRegistrar {
485488

489+
private final ReflectiveRuntimeHintsRegistrar reflectiveRegistrar = new ReflectiveRuntimeHintsRegistrar();
490+
486491
@Override
487492
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
488-
Method handlerMethod = ReflectionUtils.findMethod(OperationHandler.class, "handle",
489-
HttpServletRequest.class, Map.class);
490-
Assert.state(handlerMethod != null, "Unable to find 'handler' method");
491-
hints.reflection().registerMethod(handlerMethod);
493+
this.reflectiveRegistrar.registerRuntimeHints(hints, OperationHandler.class);
492494
}
493495

494496
}

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/servlet/WebMvcEndpointHandlerMapping.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.boot.actuate.endpoint.web.servlet;
1818

19-
import java.lang.reflect.Method;
2019
import java.util.Collection;
2120
import java.util.Collections;
2221
import java.util.Map;
@@ -26,6 +25,8 @@
2625

2726
import org.springframework.aot.hint.RuntimeHints;
2827
import org.springframework.aot.hint.RuntimeHintsRegistrar;
28+
import org.springframework.aot.hint.annotation.Reflective;
29+
import org.springframework.aot.hint.annotation.ReflectiveRuntimeHintsRegistrar;
2930
import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
3031
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
3132
import org.springframework.boot.actuate.endpoint.web.EndpointMediaTypes;
@@ -34,8 +35,6 @@
3435
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.WebMvcEndpointHandlerMappingRuntimeHints;
3536
import org.springframework.context.annotation.ImportRuntimeHints;
3637
import org.springframework.context.aot.BindingReflectionHintsRegistrar;
37-
import org.springframework.util.Assert;
38-
import org.springframework.util.ReflectionUtils;
3938
import org.springframework.web.bind.annotation.ResponseBody;
4039
import org.springframework.web.cors.CorsConfiguration;
4140
import org.springframework.web.servlet.HandlerMapping;
@@ -83,6 +82,7 @@ class WebMvcLinksHandler implements LinksHandler {
8382

8483
@Override
8584
@ResponseBody
85+
@Reflective
8686
public Map<String, Map<String, Link>> links(HttpServletRequest request, HttpServletResponse response) {
8787
return Collections.singletonMap("_links",
8888
WebMvcEndpointHandlerMapping.this.linksResolver.resolveLinks(request.getRequestURL().toString()));
@@ -97,14 +97,13 @@ public String toString() {
9797

9898
static class WebMvcEndpointHandlerMappingRuntimeHints implements RuntimeHintsRegistrar {
9999

100+
private final ReflectiveRuntimeHintsRegistrar reflectiveRegistrar = new ReflectiveRuntimeHintsRegistrar();
101+
100102
private final BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
101103

102104
@Override
103105
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
104-
Method linksMethod = ReflectionUtils.findMethod(WebMvcLinksHandler.class, "links", HttpServletRequest.class,
105-
HttpServletResponse.class);
106-
Assert.state(linksMethod != null, "Unable to find 'links' method");
107-
hints.reflection().registerMethod(linksMethod);
106+
this.reflectiveRegistrar.registerRuntimeHints(hints, WebMvcLinksHandler.class);
108107
this.bindingRegistrar.registerReflectionHints(hints.reflection(), Link.class);
109108
}
110109

0 commit comments

Comments
 (0)