|
|
|
@ -22,8 +22,6 @@ import java.lang.reflect.ParameterizedType; |
|
|
|
import java.lang.reflect.Type; |
|
|
|
import java.lang.reflect.Type; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
import java.util.stream.IntStream; |
|
|
|
|
|
|
|
import java.util.stream.Stream; |
|
|
|
import java.util.stream.Stream; |
|
|
|
|
|
|
|
|
|
|
|
import reactor.core.publisher.Mono; |
|
|
|
import reactor.core.publisher.Mono; |
|
|
|
@ -38,7 +36,6 @@ import org.springframework.http.server.reactive.ServerHttpResponse; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
import org.springframework.lang.Nullable; |
|
|
|
import org.springframework.util.ObjectUtils; |
|
|
|
import org.springframework.util.ObjectUtils; |
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
import org.springframework.util.StringUtils; |
|
|
|
|
|
|
|
import org.springframework.web.method.HandlerMethod; |
|
|
|
import org.springframework.web.method.HandlerMethod; |
|
|
|
import org.springframework.web.reactive.BindingContext; |
|
|
|
import org.springframework.web.reactive.BindingContext; |
|
|
|
import org.springframework.web.reactive.HandlerResult; |
|
|
|
import org.springframework.web.reactive.HandlerResult; |
|
|
|
@ -204,23 +201,6 @@ public class InvocableHandlerMethod extends HandlerMethod { |
|
|
|
Stream.of(values).map(o -> o != NO_ARG_VALUE ? o : null).toArray()); |
|
|
|
Stream.of(values).map(o -> o != NO_ARG_VALUE ? o : null).toArray()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Nullable |
|
|
|
|
|
|
|
private Object findProvidedArgument(MethodParameter parameter, @Nullable Object... providedArgs) { |
|
|
|
|
|
|
|
if (!ObjectUtils.isEmpty(providedArgs)) { |
|
|
|
|
|
|
|
for (Object providedArg : providedArgs) { |
|
|
|
|
|
|
|
if (parameter.getParameterType().isInstance(providedArg)) { |
|
|
|
|
|
|
|
return providedArg; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static String formatArgumentError(MethodParameter param, String message) { |
|
|
|
|
|
|
|
return "Could not resolve parameter [" + param.getParameterIndex() + "] in " + |
|
|
|
|
|
|
|
param.getExecutable().toGenericString() + (StringUtils.hasText(message) ? ": " + message : ""); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void logArgumentErrorIfNecessary( |
|
|
|
private void logArgumentErrorIfNecessary( |
|
|
|
ServerWebExchange exchange, MethodParameter parameter, Throwable cause) { |
|
|
|
ServerWebExchange exchange, MethodParameter parameter, Throwable cause) { |
|
|
|
|
|
|
|
|
|
|
|
@ -233,39 +213,6 @@ public class InvocableHandlerMethod extends HandlerMethod { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* Assert that the target bean class is an instance of the class where the given |
|
|
|
|
|
|
|
* method is declared. In some cases the actual controller instance at request- |
|
|
|
|
|
|
|
* processing time may be a JDK dynamic proxy (lazy initialization, prototype |
|
|
|
|
|
|
|
* beans, and others). {@code @Controller}'s that require proxying should prefer |
|
|
|
|
|
|
|
* class-based proxy mechanisms. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
private void assertTargetBean(Method method, Object targetBean, Object[] args) { |
|
|
|
|
|
|
|
Class<?> methodDeclaringClass = method.getDeclaringClass(); |
|
|
|
|
|
|
|
Class<?> targetBeanClass = targetBean.getClass(); |
|
|
|
|
|
|
|
if (!methodDeclaringClass.isAssignableFrom(targetBeanClass)) { |
|
|
|
|
|
|
|
String text = "The mapped handler method class '" + methodDeclaringClass.getName() + |
|
|
|
|
|
|
|
"' is not an instance of the actual controller bean class '" + |
|
|
|
|
|
|
|
targetBeanClass.getName() + "'. If the controller requires proxying " + |
|
|
|
|
|
|
|
"(e.g. due to @Transactional), please use class-based proxying."; |
|
|
|
|
|
|
|
throw new IllegalStateException(formatInvokeError(text, args)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String formatInvokeError(String text, Object[] args) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String formattedArgs = IntStream.range(0, args.length) |
|
|
|
|
|
|
|
.mapToObj(i -> (args[i] != null ? |
|
|
|
|
|
|
|
"[" + i + "] [type=" + args[i].getClass().getName() + "] [value=" + args[i] + "]" : |
|
|
|
|
|
|
|
"[" + i + "] [null]")) |
|
|
|
|
|
|
|
.collect(Collectors.joining(",\n", " ", " ")); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return text + "\n" + |
|
|
|
|
|
|
|
"Controller [" + getBeanType().getName() + "]\n" + |
|
|
|
|
|
|
|
"Method [" + getBridgedMethod().toGenericString() + "]\n" + |
|
|
|
|
|
|
|
"with argument values:\n" + formattedArgs; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean isAsyncVoidReturnType(MethodParameter returnType, |
|
|
|
private boolean isAsyncVoidReturnType(MethodParameter returnType, |
|
|
|
@Nullable ReactiveAdapter reactiveAdapter) { |
|
|
|
@Nullable ReactiveAdapter reactiveAdapter) { |
|
|
|
|
|
|
|
|
|
|
|
|