提交 8038fb9c 编写于 作者: J Juergen Hoeller

HandlerMethod pre-resolves parameter types at construction time

Issue: SPR-15186
上级 4e65c102
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 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.
...@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory; ...@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.core.BridgeMethodResolver; import org.springframework.core.BridgeMethodResolver;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.core.annotation.SynthesizingMethodParameter;
...@@ -36,9 +37,10 @@ import org.springframework.util.ClassUtils; ...@@ -36,9 +37,10 @@ import org.springframework.util.ClassUtils;
* Provides convenient access to method parameters, the method return value, * Provides convenient access to method parameters, the method return value,
* method annotations, etc. * method annotations, etc.
* *
* <p>The class may be created with a bean instance or with a bean name (e.g. lazy-init bean, * <p>The class may be created with a bean instance or with a bean name
* prototype bean). Use {@link #createWithResolvedBean()} to obtain a {@code HandlerMethod} * (e.g. lazy-init bean, prototype bean). Use {@link #createWithResolvedBean()}
* instance with a bean instance resolved through the associated {@link BeanFactory}. * to obtain a {@code HandlerMethod} instance with a bean instance resolved
* through the associated {@link BeanFactory}.
* *
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
...@@ -148,7 +150,9 @@ public class HandlerMethod { ...@@ -148,7 +150,9 @@ public class HandlerMethod {
int count = this.bridgedMethod.getParameterCount(); int count = this.bridgedMethod.getParameterCount();
MethodParameter[] result = new MethodParameter[count]; MethodParameter[] result = new MethodParameter[count];
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
result[i] = new HandlerMethodParameter(i); HandlerMethodParameter parameter = new HandlerMethodParameter(i);
GenericTypeResolver.resolveParameterType(parameter, this.beanType);
result[i] = parameter;
} }
return result; return result;
} }
......
...@@ -22,7 +22,6 @@ import java.lang.reflect.Type; ...@@ -22,7 +22,6 @@ import java.lang.reflect.Type;
import java.util.Arrays; import java.util.Arrays;
import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.core.ResolvableType; import org.springframework.core.ResolvableType;
...@@ -127,7 +126,6 @@ public class InvocableHandlerMethod extends HandlerMethod { ...@@ -127,7 +126,6 @@ public class InvocableHandlerMethod extends HandlerMethod {
for (int i = 0; i < parameters.length; i++) { for (int i = 0; i < parameters.length; i++) {
MethodParameter parameter = parameters[i]; MethodParameter parameter = parameters[i];
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer); parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
GenericTypeResolver.resolveParameterType(parameter, getBean().getClass());
args[i] = resolveProvidedArgument(parameter, providedArgs); args[i] = resolveProvidedArgument(parameter, providedArgs);
if (args[i] != null) { if (args[i] != null) {
continue; continue;
......
...@@ -123,7 +123,6 @@ public class InvocableHandlerMethod extends HandlerMethod { ...@@ -123,7 +123,6 @@ public class InvocableHandlerMethod extends HandlerMethod {
List<Mono<Object>> argMonos = Stream.of(getMethodParameters()) List<Mono<Object>> argMonos = Stream.of(getMethodParameters())
.map(param -> { .map(param -> {
param.initParameterNameDiscovery(this.parameterNameDiscoverer); param.initParameterNameDiscovery(this.parameterNameDiscoverer);
GenericTypeResolver.resolveParameterType(param, getBean().getClass());
return findProvidedArgument(param, providedArgs) return findProvidedArgument(param, providedArgs)
.map(Mono::just) .map(Mono::just)
.orElseGet(() -> { .orElseGet(() -> {
......
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2017 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.
...@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory; ...@@ -24,6 +24,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.core.BridgeMethodResolver; import org.springframework.core.BridgeMethodResolver;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.core.annotation.SynthesizingMethodParameter;
...@@ -36,9 +37,10 @@ import org.springframework.util.ClassUtils; ...@@ -36,9 +37,10 @@ import org.springframework.util.ClassUtils;
* Provides convenient access to method parameters, the method return value, * Provides convenient access to method parameters, the method return value,
* method annotations, etc. * method annotations, etc.
* *
* <p>The class may be created with a bean instance or with a bean name (e.g. lazy-init bean, * <p>The class may be created with a bean instance or with a bean name
* prototype bean). Use {@link #createWithResolvedBean()} to obtain a {@code HandlerMethod} * (e.g. lazy-init bean, prototype bean). Use {@link #createWithResolvedBean()}
* instance with a bean instance resolved through the associated {@link BeanFactory}. * to obtain a {@code HandlerMethod} instance with a bean instance resolved
* through the associated {@link BeanFactory}.
* *
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
...@@ -149,7 +151,9 @@ public class HandlerMethod { ...@@ -149,7 +151,9 @@ public class HandlerMethod {
int count = this.bridgedMethod.getParameterCount(); int count = this.bridgedMethod.getParameterCount();
MethodParameter[] result = new MethodParameter[count]; MethodParameter[] result = new MethodParameter[count];
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
result[i] = new HandlerMethodParameter(i); HandlerMethodParameter parameter = new HandlerMethodParameter(i);
GenericTypeResolver.resolveParameterType(parameter, this.beanType);
result[i] = parameter;
} }
return result; return result;
} }
......
...@@ -21,7 +21,6 @@ import java.lang.reflect.Method; ...@@ -21,7 +21,6 @@ import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
...@@ -150,7 +149,6 @@ public class InvocableHandlerMethod extends HandlerMethod { ...@@ -150,7 +149,6 @@ public class InvocableHandlerMethod extends HandlerMethod {
for (int i = 0; i < parameters.length; i++) { for (int i = 0; i < parameters.length; i++) {
MethodParameter parameter = parameters[i]; MethodParameter parameter = parameters[i];
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer); parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
GenericTypeResolver.resolveParameterType(parameter, getBean().getClass());
args[i] = resolveProvidedArgument(parameter, providedArgs); args[i] = resolveProvidedArgument(parameter, providedArgs);
if (args[i] != null) { if (args[i] != null) {
continue; continue;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册