From 1420b970a7f033147ef9f27edab5fee4ee19996b Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 7 Aug 2013 16:56:45 +0200 Subject: [PATCH] Introduced DefaultParameterNameDiscoverer which checks JDK 8's standard reflection first and then falls back to ASM-based debug symbol analysis Also, StandardReflectionParameterNameDiscoverer calls "Parameter.isNamePresent()" now to return null (and pass on to the next discoverer) if no JDK 8 parameters are available. Note that this requires OpenJDK 8 b100 or higher to compile now. Issue: SPR-10532 --- .../aop/aspectj/AbstractAspectJAdvice.java | 13 +++--- .../MethodInvocationProceedingJoinPoint.java | 7 ++- .../AbstractAspectJAdvisorFactory.java | 13 +----- .../AbstractAutowireCapableBeanFactory.java | 6 +-- .../interceptor/ExpressionEvaluator.java | 4 +- .../AbstractReflectiveMBeanInfoAssembler.java | 6 +-- .../LocalValidatorFactoryBean.java | 9 ++-- .../core/DefaultParameterNameDiscoverer.java | 45 +++++++++++++++++++ ...dardReflectionParameterNameDiscoverer.java | 14 +++++- .../support/InvocableHandlerMethod.java | 9 ++-- .../AnnotationMethodHandlerAdapter.java | 6 +-- .../AnnotationMethodHandlerAdapter.java | 5 ++- .../RequestMappingHandlerAdapter.java | 11 +++-- 13 files changed, 97 insertions(+), 51 deletions(-) create mode 100644 spring-core/src/main/java/org/springframework/core/DefaultParameterNameDiscoverer.java diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java index 3a6436c7f8..31e1106d62 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/AbstractAspectJAdvice.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,9 +37,8 @@ import org.springframework.aop.interceptor.ExposeInvocationInterceptor; import org.springframework.aop.support.ComposablePointcut; import org.springframework.aop.support.MethodMatchers; import org.springframework.aop.support.StaticMethodMatcher; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; -import org.springframework.core.PrioritizedParameterNameDiscoverer; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; @@ -435,15 +434,13 @@ public abstract class AbstractAspectJAdvice implements Advice, AspectJPrecedence /** * Create a ParameterNameDiscoverer to be used for argument binding. - *

The default implementation creates a {@link PrioritizedParameterNameDiscoverer} - * containing a {@link LocalVariableTableParameterNameDiscoverer} and an - * {@link AspectJAdviceParameterNameDiscoverer}. + *

The default implementation creates a {@link DefaultParameterNameDiscoverer} + * and adds a specifically configured {@link AspectJAdviceParameterNameDiscoverer}. */ protected ParameterNameDiscoverer createParameterNameDiscoverer() { // We need to discover them, or if that fails, guess, // and if we can't guess with 100% accuracy, fail. - PrioritizedParameterNameDiscoverer discoverer = new PrioritizedParameterNameDiscoverer(); - discoverer.addDiscoverer(new LocalVariableTableParameterNameDiscoverer()); + DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer(); AspectJAdviceParameterNameDiscoverer adviceParameterNameDiscoverer = new AspectJAdviceParameterNameDiscoverer(this.pointcut.getExpression()); adviceParameterNameDiscoverer.setReturningName(this.returningName); diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java index a681815fa2..d746228024 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java @@ -27,7 +27,8 @@ import org.aspectj.lang.reflect.SourceLocation; import org.aspectj.runtime.internal.AroundClosure; import org.springframework.aop.ProxyMethodInvocation; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.ParameterNameDiscoverer; import org.springframework.util.Assert; /** @@ -51,6 +52,8 @@ import org.springframework.util.Assert; */ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, JoinPoint.StaticPart { + private static final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); + private final ProxyMethodInvocation methodInvocation; private Object[] defensiveCopyOfArgs; @@ -213,7 +216,7 @@ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, @Override public String[] getParameterNames() { if (this.parameterNames == null) { - this.parameterNames = (new LocalVariableTableParameterNameDiscoverer()).getParameterNames(getMethod()); + this.parameterNames = parameterNameDiscoverer.getParameterNames(getMethod()); } return this.parameterNames; } diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java index add6c5fac2..b9b49b3b1f 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/AbstractAspectJAdvisorFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,9 +59,6 @@ import org.springframework.util.StringUtils; */ public abstract class AbstractAspectJAdvisorFactory implements AspectJAdvisorFactory { - protected static final ParameterNameDiscoverer ASPECTJ_ANNOTATION_PARAMETER_NAME_DISCOVERER = - new AspectJAnnotationParameterNameDiscoverer(); - private static final String AJC_MAGIC = "ajc$"; @@ -96,15 +93,9 @@ public abstract class AbstractAspectJAdvisorFactory implements AspectJAdvisorFac /** Logger available to subclasses */ protected final Log logger = LogFactory.getLog(getClass()); - protected final ParameterNameDiscoverer parameterNameDiscoverer; + protected final ParameterNameDiscoverer parameterNameDiscoverer = new AspectJAnnotationParameterNameDiscoverer(); - protected AbstractAspectJAdvisorFactory() { - PrioritizedParameterNameDiscoverer prioritizedParameterNameDiscoverer = new PrioritizedParameterNameDiscoverer(); - prioritizedParameterNameDiscoverer.addDiscoverer(ASPECTJ_ANNOTATION_PARAMETER_NAME_DISCOVERER); - this.parameterNameDiscoverer = prioritizedParameterNameDiscoverer; - } - /** * We consider something to be an AspectJ aspect suitable for use by the Spring AOP system * if it has the @Aspect annotation, and was not compiled by ajc. The reason for this latter test diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index a36ec9009c..5636758042 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -68,8 +68,8 @@ import org.springframework.beans.factory.config.DependencyDescriptor; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor; import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor; import org.springframework.beans.factory.config.TypedStringValue; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.GenericTypeResolver; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.PriorityOrdered; @@ -120,7 +120,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy(); /** Resolver strategy for method parameter names */ - private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); /** Whether to automatically try to resolve circular references between beans */ private boolean allowCircularReferences = true; @@ -191,7 +191,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac /** * Set the ParameterNameDiscoverer to use for resolving method parameter * names if needed (e.g. for constructor names). - *

The default is {@link LocalVariableTableParameterNameDiscoverer}. + *

Default is a {@link DefaultParameterNameDiscoverer}. */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer; diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/ExpressionEvaluator.java b/spring-context/src/main/java/org/springframework/cache/interceptor/ExpressionEvaluator.java index 06704c5f27..ac5a823951 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/ExpressionEvaluator.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/ExpressionEvaluator.java @@ -22,7 +22,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.springframework.cache.Cache; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; @@ -46,7 +46,7 @@ class ExpressionEvaluator { private final SpelExpressionParser parser = new SpelExpressionParser(); // shared param discoverer since it caches data internally - private final ParameterNameDiscoverer paramNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private final ParameterNameDiscoverer paramNameDiscoverer = new DefaultParameterNameDiscoverer(); private final Map keyCache = new ConcurrentHashMap(64); diff --git a/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java b/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java index f953d9465c..1db07e96cf 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/assembler/AbstractReflectiveMBeanInfoAssembler.java @@ -30,7 +30,7 @@ import javax.management.modelmbean.ModelMBeanOperationInfo; import org.springframework.aop.framework.AopProxyUtils; import org.springframework.aop.support.AopUtils; import org.springframework.beans.BeanUtils; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.jmx.support.JmxUtils; @@ -180,7 +180,7 @@ public abstract class AbstractReflectiveMBeanInfoAssembler extends AbstractMBean private boolean exposeClassDescriptor = false; - private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); /** @@ -262,7 +262,7 @@ public abstract class AbstractReflectiveMBeanInfoAssembler extends AbstractMBean /** * Set the ParameterNameDiscoverer to use for resolving method parameter * names if needed (e.g. for parameter names of MBean operation methods). - *

The default is {@link LocalVariableTableParameterNameDiscoverer}. + *

Default is a {@link DefaultParameterNameDiscoverer}. */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer; diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java index e4d978a11e..27126bd50e 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java @@ -42,7 +42,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.MessageSource; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.io.Resource; import org.springframework.util.ClassUtils; @@ -93,7 +93,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter private ConstraintValidatorFactory constraintValidatorFactory; - private ParameterNameDiscoverer parameterNameDiscoverer; + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); private Resource[] mappingLocations; @@ -161,7 +161,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter /** * Set the ParameterNameDiscoverer to use for resolving method and constructor * parameter names if needed for message interpolation. - *

Default is a {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}. + *

Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}. */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer; @@ -269,8 +269,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter Configuration.class.getMethod("parameterNameProvider", parameterNameProviderClass); final Object defaultProvider = ReflectionUtils.invokeMethod( Configuration.class.getMethod("getDefaultParameterNameProvider"), configuration); - final ParameterNameDiscoverer discoverer = (this.parameterNameDiscoverer != null ? - this.parameterNameDiscoverer : new LocalVariableTableParameterNameDiscoverer()); + final ParameterNameDiscoverer discoverer = this.parameterNameDiscoverer; Object parameterNameProvider = Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] {parameterNameProviderClass}, new InvocationHandler() { @Override diff --git a/spring-core/src/main/java/org/springframework/core/DefaultParameterNameDiscoverer.java b/spring-core/src/main/java/org/springframework/core/DefaultParameterNameDiscoverer.java new file mode 100644 index 0000000000..3bb8759a97 --- /dev/null +++ b/spring-core/src/main/java/org/springframework/core/DefaultParameterNameDiscoverer.java @@ -0,0 +1,45 @@ +/* + * Copyright 2002-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.core; + +/** + * Default implementation of the {@link ParameterNameDiscoverer} strategy interface, + * using the Java 8 standard reflection mechanism (if available), and falling back + * to the ASM-based {@link LocalVariableTableParameterNameDiscoverer} for checking + * debug information in the class file. + * + *

Further discoverers may be added through {@link #addDiscoverer(ParameterNameDiscoverer)}. + * + * @author Juergen Hoeller + * @since 4.0 + * @see StandardReflectionParameterNameDiscoverer + * @see LocalVariableTableParameterNameDiscoverer + */ +public class DefaultParameterNameDiscoverer extends PrioritizedParameterNameDiscoverer { + + private static final boolean standardReflectionAvailable = + (JdkVersion.getMajorJavaVersion() >= JdkVersion.JAVA_18); + + + public DefaultParameterNameDiscoverer() { + if (standardReflectionAvailable) { + addDiscoverer(new StandardReflectionParameterNameDiscoverer()); + } + addDiscoverer(new LocalVariableTableParameterNameDiscoverer()); + } + +} diff --git a/spring-core/src/main/java/org/springframework/core/StandardReflectionParameterNameDiscoverer.java b/spring-core/src/main/java/org/springframework/core/StandardReflectionParameterNameDiscoverer.java index 2f06cba05e..eb353eee67 100644 --- a/spring-core/src/main/java/org/springframework/core/StandardReflectionParameterNameDiscoverer.java +++ b/spring-core/src/main/java/org/springframework/core/StandardReflectionParameterNameDiscoverer.java @@ -20,6 +20,8 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Parameter; +import org.springframework.util.ClassUtils; + /** * {@link ParameterNameDiscoverer} implementation which uses JDK 8's * reflection facilities for introspecting parameter names. @@ -35,7 +37,11 @@ public class StandardReflectionParameterNameDiscoverer implements ParameterNameD Parameter[] parameters = method.getParameters(); String[] parameterNames = new String[parameters.length]; for (int i = 0; i < parameters.length; i++) { - parameterNames[i] = parameters[i].getName(); + Parameter param = parameters[i]; + if (!param.isNamePresent()) { + return null; + } + parameterNames[i] = param.getName(); } return parameterNames; } @@ -45,7 +51,11 @@ public class StandardReflectionParameterNameDiscoverer implements ParameterNameD Parameter[] parameters = ctor.getParameters(); String[] parameterNames = new String[parameters.length]; for (int i = 0; i < parameters.length; i++) { - parameterNames[i] = parameters[i].getName(); + Parameter param = parameters[i]; + if (!param.isNamePresent()) { + return null; + } + parameterNames[i] = param.getName(); } return parameterNames; } diff --git a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java index 8ec8dbb858..c7de90b22f 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java @@ -20,8 +20,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.GenericTypeResolver; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.util.ReflectionUtils; @@ -51,7 +51,7 @@ public class InvocableHandlerMethod extends HandlerMethod { private WebDataBinderFactory dataBinderFactory; - private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); /** @@ -97,8 +97,9 @@ public class InvocableHandlerMethod extends HandlerMethod { } /** - * Set the ParameterNameDiscoverer for resolving parameter names when needed (e.g. default request attribute name). - *

Default is an {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer} instance. + * Set the ParameterNameDiscoverer for resolving parameter names when needed + * (e.g. default request attribute name). + *

Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}. */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer; diff --git a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java index 34cf77e22b..a10b4aa4dd 100644 --- a/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java +++ b/spring-webmvc-portlet/src/main/java/org/springframework/web/portlet/mvc/annotation/AnnotationMethodHandlerAdapter.java @@ -58,7 +58,7 @@ import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.config.BeanExpressionContext; import org.springframework.beans.factory.config.BeanExpressionResolver; import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.Ordered; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.annotation.AnnotationUtils; @@ -138,7 +138,7 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator private boolean synchronizeOnSession = false; - private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); private WebArgumentResolver[] customArgumentResolvers; @@ -211,7 +211,7 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator /** * Set the ParameterNameDiscoverer to use for resolving method parameter * names if needed (e.g. for default attribute names). - *

Default is a {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}. + *

Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}. */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java index 9e4baa213c..62343d5683 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/annotation/AnnotationMethodHandlerAdapter.java @@ -52,6 +52,7 @@ import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.config.BeanExpressionContext; import org.springframework.beans.factory.config.BeanExpressionResolver; import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.Ordered; import org.springframework.core.ParameterNameDiscoverer; @@ -173,7 +174,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator private boolean synchronizeOnSession = false; - private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); private WebArgumentResolver[] customArgumentResolvers; @@ -312,7 +313,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator /** * Set the ParameterNameDiscoverer to use for resolving method parameter names if needed * (e.g. for default attribute names). - *

Default is a {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}. + *

Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}. */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java index 96d905b9af..65210db2a4 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java @@ -26,7 +26,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; - import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -36,7 +35,7 @@ import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; +import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.OrderComparator; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.annotation.AnnotationUtils; @@ -150,7 +149,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i private SessionAttributeStore sessionAttributeStore = new DefaultSessionAttributeStore(); - private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); private ConfigurableBeanFactory beanFactory; @@ -452,9 +451,9 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i } /** - * Set the ParameterNameDiscoverer to use for resolving method parameter - * names if needed (e.g. for default attribute names). Default is a - * {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}. + * Set the ParameterNameDiscoverer to use for resolving method parameter names if needed + * (e.g. for default attribute names). + *

Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}. */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer;