From 9a0bfd7306405a833857150ad2886ffd657edd7f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 17 Dec 2025 14:30:44 +0100 Subject: [PATCH] Do not attempt nested PropertyHandler resolution for argument conversion This is not actually triggered on 6.2.x but nevertheless worth aligning. Includes fix for return type declaration in PropertyAccessor subclasses. Includes related polishing from main commits. See gh-36024 --- .../beans/AbstractNestablePropertyAccessor.java | 3 +++ .../java/org/springframework/beans/BeanWrapperImpl.java | 2 +- .../org/springframework/beans/DirectFieldAccessor.java | 2 +- .../cache/interceptor/CacheEvaluationContextFactory.java | 3 +++ .../org/springframework/core/MethodParameterTests.java | 3 ++- .../web/servlet/handler/AbstractHandlerMethodMapping.java | 7 ++++--- 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java index dbf574ef9a0..2416ebec897 100644 --- a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java @@ -489,6 +489,9 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA @Override @Nullable public Class getPropertyType(String propertyName) throws BeansException { + if (this.wrappedObject == null) { + return null; + } try { PropertyHandler ph = getPropertyHandler(propertyName); if (ph != null) { diff --git a/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java b/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java index ba03856d7fb..61b1a11b07f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java +++ b/spring-beans/src/main/java/org/springframework/beans/BeanWrapperImpl.java @@ -192,7 +192,7 @@ public class BeanWrapperImpl extends AbstractNestablePropertyAccessor implements @Override @Nullable - protected BeanPropertyHandler getLocalPropertyHandler(String propertyName) { + protected PropertyHandler getLocalPropertyHandler(String propertyName) { PropertyDescriptor pd = getCachedIntrospectionResults().getPropertyDescriptor(propertyName); return (pd != null ? new BeanPropertyHandler((GenericTypeAwarePropertyDescriptor) pd) : null); } diff --git a/spring-beans/src/main/java/org/springframework/beans/DirectFieldAccessor.java b/spring-beans/src/main/java/org/springframework/beans/DirectFieldAccessor.java index 53b0efe01c6..7c620212e69 100644 --- a/spring-beans/src/main/java/org/springframework/beans/DirectFieldAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/DirectFieldAccessor.java @@ -73,7 +73,7 @@ public class DirectFieldAccessor extends AbstractNestablePropertyAccessor { @Override @Nullable - protected FieldPropertyHandler getLocalPropertyHandler(String propertyName) { + protected PropertyHandler getLocalPropertyHandler(String propertyName) { FieldPropertyHandler propertyHandler = this.fieldMap.get(propertyName); if (propertyHandler == null) { Field field = ReflectionUtils.findField(getWrappedClass(), propertyName); diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheEvaluationContextFactory.java b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheEvaluationContextFactory.java index 5a037faf7a2..67e8743a431 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheEvaluationContextFactory.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheEvaluationContextFactory.java @@ -39,10 +39,12 @@ class CacheEvaluationContextFactory { @Nullable private Supplier parameterNameDiscoverer; + CacheEvaluationContextFactory(StandardEvaluationContext originalContext) { this.originalContext = originalContext; } + public void setParameterNameDiscoverer(Supplier parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer; } @@ -54,6 +56,7 @@ class CacheEvaluationContextFactory { return this.parameterNameDiscoverer.get(); } + /** * Creates a {@link CacheEvaluationContext} for the specified operation. * @param rootObject the {@code root} object to use for the context diff --git a/spring-core/src/test/java/org/springframework/core/MethodParameterTests.java b/spring-core/src/test/java/org/springframework/core/MethodParameterTests.java index 3ec6fec5885..2571b711cab 100644 --- a/spring-core/src/test/java/org/springframework/core/MethodParameterTests.java +++ b/spring-core/src/test/java/org/springframework/core/MethodParameterTests.java @@ -237,7 +237,8 @@ class MethodParameterTests { assertThat(m3.getTypeIndexForCurrentLevel()).isEqualTo(3); } - public int method(String p1, long p2) { + + public int method(String str, long lng) { return 42; } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java index 14489720374..cecc6e7f537 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMethodMapping.java @@ -636,14 +636,15 @@ public abstract class AbstractHandlerMethodMapping extends AbstractHandlerMap HandlerMethod handlerMethod = createHandlerMethod(handler, method); validateMethodMapping(handlerMethod, mapping); - Set directPaths = AbstractHandlerMethodMapping.this.getDirectPaths(mapping); + Set directPaths = getDirectPaths(mapping); for (String path : directPaths) { this.pathLookup.add(path, mapping); } String name = null; - if (getNamingStrategy() != null) { - name = getNamingStrategy().getName(handlerMethod, mapping); + HandlerMethodMappingNamingStrategy namingStrategy = getNamingStrategy(); + if (namingStrategy != null) { + name = namingStrategy.getName(handlerMethod, mapping); addMappingName(name, handlerMethod); }