From bc2e89a7861b785137b2ac2614f1260288bae9db Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 12 Feb 2026 13:44:54 +0100 Subject: [PATCH] Cache ResponseBody annotation presence per controller class See gh-36311 --- .../method/annotation/ResponseBodyResultHandler.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseBodyResultHandler.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseBodyResultHandler.java index dcd8088592d..6ea7117cca9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseBodyResultHandler.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseBodyResultHandler.java @@ -19,6 +19,8 @@ package org.springframework.web.reactive.result.method.annotation; import java.net.URI; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import reactor.core.publisher.Mono; @@ -53,6 +55,9 @@ import org.springframework.web.server.ServerWebExchange; */ public class ResponseBodyResultHandler extends AbstractMessageWriterResultHandler implements HandlerResultHandler { + private final Map, Boolean> responseBodyControllerCache = new ConcurrentHashMap<>(); + + /** * Basic constructor with a default {@link ReactiveAdapterRegistry}. * @param writers the writers for serializing to the response body @@ -93,8 +98,8 @@ public class ResponseBodyResultHandler extends AbstractMessageWriterResultHandle @Override public boolean supports(HandlerResult result) { MethodParameter returnType = result.getReturnTypeSource(); - Class containingClass = returnType.getContainingClass(); - return (AnnotatedElementUtils.hasAnnotation(containingClass, ResponseBody.class) || + return (this.responseBodyControllerCache.computeIfAbsent(returnType.getContainingClass(), + clazz -> AnnotatedElementUtils.hasAnnotation(clazz, ResponseBody.class)) || returnType.hasMethodAnnotation(ResponseBody.class)); }