Browse Source

Cache ResponseBody annotation presence per controller class

Closes gh-36311
pull/36325/head
Juergen Hoeller 1 month ago
parent
commit
1703388074
  1. 8
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java

8
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java

@ -20,6 +20,8 @@ import java.io.IOException; @@ -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 @@ -67,6 +69,9 @@ import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolv
*/
public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {
private final Map<Class<?>, 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 @@ -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));
}

Loading…
Cancel
Save