Consistent parameter retrieval across InvocableHandlerMethod variants

See gh-22900
This commit is contained in:
Juergen Hoeller 2019-05-07 01:33:07 +02:00
parent f56c70d2f0
commit 85cecb66e5
1 changed files with 8 additions and 12 deletions

View File

@ -109,12 +109,8 @@ public class InvocableHandlerMethod extends HandlerMethod {
} }
/** /**
* Configure a reactive registry. This is needed for cases where the response * Configure a reactive adapter registry. This is needed for async return values.
* is fully handled within the controller in combination with an async void * <p>By default this is a {@link ReactiveAdapterRegistry} with default settings.
* return value.
* <p>By default this is an instance of {@link ReactiveAdapterRegistry} with
* default settings.
* @param registry the registry to use
*/ */
public void setReactiveAdapterRegistry(ReactiveAdapterRegistry registry) { public void setReactiveAdapterRegistry(ReactiveAdapterRegistry registry) {
this.reactiveAdapterRegistry = registry; this.reactiveAdapterRegistry = registry;
@ -125,11 +121,10 @@ public class InvocableHandlerMethod extends HandlerMethod {
* Invoke the method for the given exchange. * Invoke the method for the given exchange.
* @param message the current message * @param message the current message
* @param providedArgs optional list of argument values to match by type * @param providedArgs optional list of argument values to match by type
* @return a Mono with the result from the invocation. * @return a Mono with the result from the invocation
*/ */
@SuppressWarnings("KotlinInternalInJava") @SuppressWarnings("KotlinInternalInJava")
public Mono<Object> invoke(Message<?> message, Object... providedArgs) { public Mono<Object> invoke(Message<?> message, Object... providedArgs) {
return getMethodArgumentValues(message, providedArgs).flatMap(args -> { return getMethodArgumentValues(message, providedArgs).flatMap(args -> {
Object value; Object value;
try { try {
@ -157,16 +152,17 @@ public class InvocableHandlerMethod extends HandlerMethod {
MethodParameter returnType = getReturnType(); MethodParameter returnType = getReturnType();
ReactiveAdapter adapter = this.reactiveAdapterRegistry.getAdapter(returnType.getParameterType()); ReactiveAdapter adapter = this.reactiveAdapterRegistry.getAdapter(returnType.getParameterType());
return isAsyncVoidReturnType(returnType, adapter) ? return (isAsyncVoidReturnType(returnType, adapter) ?
Mono.from(adapter.toPublisher(value)) : Mono.justOrEmpty(value); Mono.from(adapter.toPublisher(value)) : Mono.justOrEmpty(value));
}); });
} }
private Mono<Object[]> getMethodArgumentValues(Message<?> message, Object... providedArgs) { private Mono<Object[]> getMethodArgumentValues(Message<?> message, Object... providedArgs) {
MethodParameter[] parameters = getMethodParameters();
if (ObjectUtils.isEmpty(getMethodParameters())) { if (ObjectUtils.isEmpty(getMethodParameters())) {
return EMPTY_ARGS; return EMPTY_ARGS;
} }
MethodParameter[] parameters = getMethodParameters();
List<Mono<Object>> argMonos = new ArrayList<>(parameters.length); List<Mono<Object>> argMonos = new ArrayList<>(parameters.length);
for (MethodParameter parameter : parameters) { for (MethodParameter parameter : parameters) {
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer); parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
@ -196,7 +192,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
private void logArgumentErrorIfNecessary(MethodParameter parameter, Throwable ex) { private void logArgumentErrorIfNecessary(MethodParameter parameter, Throwable ex) {
// Leave stack trace for later, if error is not handled... // Leave stack trace for later, if error is not handled...
String exMsg = ex.getMessage(); String exMsg = ex.getMessage();
if (!exMsg.contains(parameter.getExecutable().toGenericString())) { if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug(formatArgumentError(parameter, exMsg)); logger.debug(formatArgumentError(parameter, exMsg));
} }