From 17033880748a04b0d777b5f34ab12d8d5f087e32 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 12 Feb 2026 12:20:14 +0100 Subject: [PATCH] Cache ResponseBody annotation presence per controller class Closes gh-36311 --- .../annotation/RequestResponseBodyMethodProcessor.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java index 7b3990fd9ca..a08b1170845 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java @@ -20,6 +20,8 @@ import java.io.IOException; import java.lang.reflect.Type; import java.net.URI; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.jspecify.annotations.Nullable; @@ -67,6 +69,9 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv */ public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor { + private final Map, Boolean> responseBodyControllerCache = new ConcurrentHashMap<>(); + + /** * Basic constructor with converters only. Suitable for resolving * {@code @RequestBody}. For handling {@code @ResponseBody} consider also @@ -132,7 +137,8 @@ public class RequestResponseBodyMethodProcessor extends AbstractMessageConverter @Override public boolean supportsReturnType(MethodParameter returnType) { - return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) || + return (this.responseBodyControllerCache.computeIfAbsent(returnType.getContainingClass(), + clazz -> AnnotatedElementUtils.hasAnnotation(clazz, ResponseBody.class)) || returnType.hasMethodAnnotation(ResponseBody.class)); }