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
This commit is contained in:
parent
f9325a8376
commit
1420b970a7
|
@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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.ComposablePointcut;
|
||||||
import org.springframework.aop.support.MethodMatchers;
|
import org.springframework.aop.support.MethodMatchers;
|
||||||
import org.springframework.aop.support.StaticMethodMatcher;
|
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.ParameterNameDiscoverer;
|
||||||
import org.springframework.core.PrioritizedParameterNameDiscoverer;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.CollectionUtils;
|
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.
|
* Create a ParameterNameDiscoverer to be used for argument binding.
|
||||||
* <p>The default implementation creates a {@link PrioritizedParameterNameDiscoverer}
|
* <p>The default implementation creates a {@link DefaultParameterNameDiscoverer}
|
||||||
* containing a {@link LocalVariableTableParameterNameDiscoverer} and an
|
* and adds a specifically configured {@link AspectJAdviceParameterNameDiscoverer}.
|
||||||
* {@link AspectJAdviceParameterNameDiscoverer}.
|
|
||||||
*/
|
*/
|
||||||
protected ParameterNameDiscoverer createParameterNameDiscoverer() {
|
protected ParameterNameDiscoverer createParameterNameDiscoverer() {
|
||||||
// We need to discover them, or if that fails, guess,
|
// We need to discover them, or if that fails, guess,
|
||||||
// and if we can't guess with 100% accuracy, fail.
|
// and if we can't guess with 100% accuracy, fail.
|
||||||
PrioritizedParameterNameDiscoverer discoverer = new PrioritizedParameterNameDiscoverer();
|
DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
|
||||||
discoverer.addDiscoverer(new LocalVariableTableParameterNameDiscoverer());
|
|
||||||
AspectJAdviceParameterNameDiscoverer adviceParameterNameDiscoverer =
|
AspectJAdviceParameterNameDiscoverer adviceParameterNameDiscoverer =
|
||||||
new AspectJAdviceParameterNameDiscoverer(this.pointcut.getExpression());
|
new AspectJAdviceParameterNameDiscoverer(this.pointcut.getExpression());
|
||||||
adviceParameterNameDiscoverer.setReturningName(this.returningName);
|
adviceParameterNameDiscoverer.setReturningName(this.returningName);
|
||||||
|
|
|
@ -27,7 +27,8 @@ import org.aspectj.lang.reflect.SourceLocation;
|
||||||
import org.aspectj.runtime.internal.AroundClosure;
|
import org.aspectj.runtime.internal.AroundClosure;
|
||||||
|
|
||||||
import org.springframework.aop.ProxyMethodInvocation;
|
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;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,6 +52,8 @@ import org.springframework.util.Assert;
|
||||||
*/
|
*/
|
||||||
public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, JoinPoint.StaticPart {
|
public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint, JoinPoint.StaticPart {
|
||||||
|
|
||||||
|
private static final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
|
||||||
|
|
||||||
private final ProxyMethodInvocation methodInvocation;
|
private final ProxyMethodInvocation methodInvocation;
|
||||||
|
|
||||||
private Object[] defensiveCopyOfArgs;
|
private Object[] defensiveCopyOfArgs;
|
||||||
|
@ -213,7 +216,7 @@ public class MethodInvocationProceedingJoinPoint implements ProceedingJoinPoint,
|
||||||
@Override
|
@Override
|
||||||
public String[] getParameterNames() {
|
public String[] getParameterNames() {
|
||||||
if (this.parameterNames == null) {
|
if (this.parameterNames == null) {
|
||||||
this.parameterNames = (new LocalVariableTableParameterNameDiscoverer()).getParameterNames(getMethod());
|
this.parameterNames = parameterNameDiscoverer.getParameterNames(getMethod());
|
||||||
}
|
}
|
||||||
return this.parameterNames;
|
return this.parameterNames;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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 {
|
public abstract class AbstractAspectJAdvisorFactory implements AspectJAdvisorFactory {
|
||||||
|
|
||||||
protected static final ParameterNameDiscoverer ASPECTJ_ANNOTATION_PARAMETER_NAME_DISCOVERER =
|
|
||||||
new AspectJAnnotationParameterNameDiscoverer();
|
|
||||||
|
|
||||||
private static final String AJC_MAGIC = "ajc$";
|
private static final String AJC_MAGIC = "ajc$";
|
||||||
|
|
||||||
|
|
||||||
|
@ -96,15 +93,9 @@ public abstract class AbstractAspectJAdvisorFactory implements AspectJAdvisorFac
|
||||||
/** Logger available to subclasses */
|
/** Logger available to subclasses */
|
||||||
protected final Log logger = LogFactory.getLog(getClass());
|
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
|
* 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
|
* if it has the @Aspect annotation, and was not compiled by ajc. The reason for this latter test
|
||||||
|
|
|
@ -68,8 +68,8 @@ import org.springframework.beans.factory.config.DependencyDescriptor;
|
||||||
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
|
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
|
||||||
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
|
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
|
||||||
import org.springframework.beans.factory.config.TypedStringValue;
|
import org.springframework.beans.factory.config.TypedStringValue;
|
||||||
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||||
import org.springframework.core.GenericTypeResolver;
|
import org.springframework.core.GenericTypeResolver;
|
||||||
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
|
||||||
import org.springframework.core.MethodParameter;
|
import org.springframework.core.MethodParameter;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.core.PriorityOrdered;
|
import org.springframework.core.PriorityOrdered;
|
||||||
|
@ -120,7 +120,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
||||||
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
|
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
|
||||||
|
|
||||||
/** Resolver strategy for method parameter names */
|
/** 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 */
|
/** Whether to automatically try to resolve circular references between beans */
|
||||||
private boolean allowCircularReferences = true;
|
private boolean allowCircularReferences = true;
|
||||||
|
@ -191,7 +191,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
||||||
/**
|
/**
|
||||||
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
||||||
* names if needed (e.g. for constructor names).
|
* names if needed (e.g. for constructor names).
|
||||||
* <p>The default is {@link LocalVariableTableParameterNameDiscoverer}.
|
* <p>Default is a {@link DefaultParameterNameDiscoverer}.
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
|
|
@ -22,7 +22,7 @@ import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.springframework.cache.Cache;
|
import org.springframework.cache.Cache;
|
||||||
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.expression.EvaluationContext;
|
import org.springframework.expression.EvaluationContext;
|
||||||
import org.springframework.expression.Expression;
|
import org.springframework.expression.Expression;
|
||||||
|
@ -46,7 +46,7 @@ class ExpressionEvaluator {
|
||||||
private final SpelExpressionParser parser = new SpelExpressionParser();
|
private final SpelExpressionParser parser = new SpelExpressionParser();
|
||||||
|
|
||||||
// shared param discoverer since it caches data internally
|
// shared param discoverer since it caches data internally
|
||||||
private final ParameterNameDiscoverer paramNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
|
private final ParameterNameDiscoverer paramNameDiscoverer = new DefaultParameterNameDiscoverer();
|
||||||
|
|
||||||
private final Map<String, Expression> keyCache = new ConcurrentHashMap<String, Expression>(64);
|
private final Map<String, Expression> keyCache = new ConcurrentHashMap<String, Expression>(64);
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ import javax.management.modelmbean.ModelMBeanOperationInfo;
|
||||||
import org.springframework.aop.framework.AopProxyUtils;
|
import org.springframework.aop.framework.AopProxyUtils;
|
||||||
import org.springframework.aop.support.AopUtils;
|
import org.springframework.aop.support.AopUtils;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.jmx.support.JmxUtils;
|
import org.springframework.jmx.support.JmxUtils;
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ public abstract class AbstractReflectiveMBeanInfoAssembler extends AbstractMBean
|
||||||
|
|
||||||
private boolean exposeClassDescriptor = false;
|
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
|
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
||||||
* names if needed (e.g. for parameter names of MBean operation methods).
|
* names if needed (e.g. for parameter names of MBean operation methods).
|
||||||
* <p>The default is {@link LocalVariableTableParameterNameDiscoverer}.
|
* <p>Default is a {@link DefaultParameterNameDiscoverer}.
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
|
|
@ -42,7 +42,7 @@ import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.context.ApplicationContextAware;
|
||||||
import org.springframework.context.MessageSource;
|
import org.springframework.context.MessageSource;
|
||||||
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
|
@ -93,7 +93,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter
|
||||||
|
|
||||||
private ConstraintValidatorFactory constraintValidatorFactory;
|
private ConstraintValidatorFactory constraintValidatorFactory;
|
||||||
|
|
||||||
private ParameterNameDiscoverer parameterNameDiscoverer;
|
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
|
||||||
|
|
||||||
private Resource[] mappingLocations;
|
private Resource[] mappingLocations;
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter
|
||||||
/**
|
/**
|
||||||
* Set the ParameterNameDiscoverer to use for resolving method and constructor
|
* Set the ParameterNameDiscoverer to use for resolving method and constructor
|
||||||
* parameter names if needed for message interpolation.
|
* parameter names if needed for message interpolation.
|
||||||
* <p>Default is a {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}.
|
* <p>Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}.
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
@ -269,8 +269,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter
|
||||||
Configuration.class.getMethod("parameterNameProvider", parameterNameProviderClass);
|
Configuration.class.getMethod("parameterNameProvider", parameterNameProviderClass);
|
||||||
final Object defaultProvider = ReflectionUtils.invokeMethod(
|
final Object defaultProvider = ReflectionUtils.invokeMethod(
|
||||||
Configuration.class.getMethod("getDefaultParameterNameProvider"), configuration);
|
Configuration.class.getMethod("getDefaultParameterNameProvider"), configuration);
|
||||||
final ParameterNameDiscoverer discoverer = (this.parameterNameDiscoverer != null ?
|
final ParameterNameDiscoverer discoverer = this.parameterNameDiscoverer;
|
||||||
this.parameterNameDiscoverer : new LocalVariableTableParameterNameDiscoverer());
|
|
||||||
Object parameterNameProvider = Proxy.newProxyInstance(getClass().getClassLoader(),
|
Object parameterNameProvider = Proxy.newProxyInstance(getClass().getClassLoader(),
|
||||||
new Class[] {parameterNameProviderClass}, new InvocationHandler() {
|
new Class[] {parameterNameProviderClass}, new InvocationHandler() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -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.
|
||||||
|
*
|
||||||
|
* <p>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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -20,6 +20,8 @@ import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.lang.reflect.Parameter;
|
import java.lang.reflect.Parameter;
|
||||||
|
|
||||||
|
import org.springframework.util.ClassUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link ParameterNameDiscoverer} implementation which uses JDK 8's
|
* {@link ParameterNameDiscoverer} implementation which uses JDK 8's
|
||||||
* reflection facilities for introspecting parameter names.
|
* reflection facilities for introspecting parameter names.
|
||||||
|
@ -35,7 +37,11 @@ public class StandardReflectionParameterNameDiscoverer implements ParameterNameD
|
||||||
Parameter[] parameters = method.getParameters();
|
Parameter[] parameters = method.getParameters();
|
||||||
String[] parameterNames = new String[parameters.length];
|
String[] parameterNames = new String[parameters.length];
|
||||||
for (int i = 0; i < parameters.length; i++) {
|
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;
|
return parameterNames;
|
||||||
}
|
}
|
||||||
|
@ -45,7 +51,11 @@ public class StandardReflectionParameterNameDiscoverer implements ParameterNameD
|
||||||
Parameter[] parameters = ctor.getParameters();
|
Parameter[] parameters = ctor.getParameters();
|
||||||
String[] parameterNames = new String[parameters.length];
|
String[] parameterNames = new String[parameters.length];
|
||||||
for (int i = 0; i < parameters.length; i++) {
|
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;
|
return parameterNames;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,8 @@ import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||||
import org.springframework.core.GenericTypeResolver;
|
import org.springframework.core.GenericTypeResolver;
|
||||||
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
|
||||||
import org.springframework.core.MethodParameter;
|
import org.springframework.core.MethodParameter;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.util.ReflectionUtils;
|
import org.springframework.util.ReflectionUtils;
|
||||||
|
@ -51,7 +51,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
|
||||||
|
|
||||||
private WebDataBinderFactory dataBinderFactory;
|
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).
|
* Set the ParameterNameDiscoverer for resolving parameter names when needed
|
||||||
* <p>Default is an {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer} instance.
|
* (e.g. default request attribute name).
|
||||||
|
* <p>Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}.
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
|
|
@ -58,7 +58,7 @@ import org.springframework.beans.factory.BeanFactoryAware;
|
||||||
import org.springframework.beans.factory.config.BeanExpressionContext;
|
import org.springframework.beans.factory.config.BeanExpressionContext;
|
||||||
import org.springframework.beans.factory.config.BeanExpressionResolver;
|
import org.springframework.beans.factory.config.BeanExpressionResolver;
|
||||||
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
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.Ordered;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.core.annotation.AnnotationUtils;
|
import org.springframework.core.annotation.AnnotationUtils;
|
||||||
|
@ -138,7 +138,7 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator
|
||||||
|
|
||||||
private boolean synchronizeOnSession = false;
|
private boolean synchronizeOnSession = false;
|
||||||
|
|
||||||
private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
|
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
|
||||||
|
|
||||||
private WebArgumentResolver[] customArgumentResolvers;
|
private WebArgumentResolver[] customArgumentResolvers;
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ public class AnnotationMethodHandlerAdapter extends PortletContentGenerator
|
||||||
/**
|
/**
|
||||||
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
||||||
* names if needed (e.g. for default attribute names).
|
* names if needed (e.g. for default attribute names).
|
||||||
* <p>Default is a {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}.
|
* <p>Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}.
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
|
|
@ -52,6 +52,7 @@ import org.springframework.beans.factory.BeanFactoryAware;
|
||||||
import org.springframework.beans.factory.config.BeanExpressionContext;
|
import org.springframework.beans.factory.config.BeanExpressionContext;
|
||||||
import org.springframework.beans.factory.config.BeanExpressionResolver;
|
import org.springframework.beans.factory.config.BeanExpressionResolver;
|
||||||
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||||
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
||||||
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
|
@ -173,7 +174,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
|
||||||
|
|
||||||
private boolean synchronizeOnSession = false;
|
private boolean synchronizeOnSession = false;
|
||||||
|
|
||||||
private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
|
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
|
||||||
|
|
||||||
private WebArgumentResolver[] customArgumentResolvers;
|
private WebArgumentResolver[] customArgumentResolvers;
|
||||||
|
|
||||||
|
@ -312,7 +313,7 @@ public class AnnotationMethodHandlerAdapter extends WebContentGenerator
|
||||||
/**
|
/**
|
||||||
* Set the ParameterNameDiscoverer to use for resolving method parameter names if needed
|
* Set the ParameterNameDiscoverer to use for resolving method parameter names if needed
|
||||||
* (e.g. for default attribute names).
|
* (e.g. for default attribute names).
|
||||||
* <p>Default is a {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}.
|
* <p>Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}.
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
|
|
@ -26,7 +26,6 @@ import java.util.Map.Entry;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
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.BeanFactoryAware;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
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.OrderComparator;
|
||||||
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
||||||
import org.springframework.core.annotation.AnnotationUtils;
|
import org.springframework.core.annotation.AnnotationUtils;
|
||||||
|
@ -150,7 +149,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i
|
||||||
|
|
||||||
private SessionAttributeStore sessionAttributeStore = new DefaultSessionAttributeStore();
|
private SessionAttributeStore sessionAttributeStore = new DefaultSessionAttributeStore();
|
||||||
|
|
||||||
private ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
|
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
|
||||||
|
|
||||||
private ConfigurableBeanFactory beanFactory;
|
private ConfigurableBeanFactory beanFactory;
|
||||||
|
|
||||||
|
@ -452,9 +451,9 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the ParameterNameDiscoverer to use for resolving method parameter
|
* Set the ParameterNameDiscoverer to use for resolving method parameter names if needed
|
||||||
* names if needed (e.g. for default attribute names). Default is a
|
* (e.g. for default attribute names).
|
||||||
* {@link org.springframework.core.LocalVariableTableParameterNameDiscoverer}.
|
* <p>Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}.
|
||||||
*/
|
*/
|
||||||
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
|
||||||
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
this.parameterNameDiscoverer = parameterNameDiscoverer;
|
||||||
|
|
Loading…
Reference in New Issue