Fix FunctionTypeUtils outout type logic for Supplier

This commit is contained in:
Oleg Zhurakousky
2021-10-26 12:01:35 +02:00
parent e58741b6cb
commit 83a96483e3
2 changed files with 25 additions and 5 deletions

View File

@@ -281,18 +281,18 @@ public final class FunctionTypeUtils {
logger.debug("Consumer does not have output type, returning null as output type."); logger.debug("Consumer does not have output type, returning null as output type.");
return null; return null;
} }
Type inputType; Type outputType;
if (functionType instanceof Class) { if (functionType instanceof Class) {
functionType = Function.class.isAssignableFrom((Class<?>) functionType) functionType = Function.class.isAssignableFrom((Class<?>) functionType)
? TypeResolver.reify(Function.class, (Class<Function<?, ?>>) functionType) ? TypeResolver.reify(Function.class, (Class<Function<?, ?>>) functionType)
: TypeResolver.reify(Function.class, (Class<Supplier<?>>) functionType); : TypeResolver.reify(Supplier.class, (Class<Supplier<?>>) functionType);
} }
inputType = functionType instanceof ParameterizedType outputType = functionType instanceof ParameterizedType
? (isSupplier(functionType) ? ((ParameterizedType) functionType).getActualTypeArguments()[0] : ((ParameterizedType) functionType).getActualTypeArguments()[1]) ? (isSupplier(functionType) ? ((ParameterizedType) functionType).getActualTypeArguments()[0] : ((ParameterizedType) functionType).getActualTypeArguments()[1])
: Object.class; : Object.class;
return inputType; return outputType;
} }
public static Type getImmediateGenericType(Type type, int index) { public static Type getImmediateGenericType(Type type, int index) {

View File

@@ -32,7 +32,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.builder.SpringApplicationBuilder;
@@ -412,6 +412,17 @@ public class SimpleFunctionRegistryTests {
assertThat(message.getHeaders().get("original")).isEqualTo("newValue"); assertThat(message.getHeaders().get("original")).isEqualTo("newValue");
} }
@Test
public void testReactiveMonoSupplier() {
FunctionRegistration<ReactiveMonoGreeter> registration = new FunctionRegistration<>(new ReactiveMonoGreeter(),
"greeter").type(FunctionType.of(ReactiveMonoGreeter.class));
SimpleFunctionRegistry catalog = new SimpleFunctionRegistry(this.conversionService, this.messageConverter,
new JacksonMapper(new ObjectMapper()));
catalog.register(registration);
FunctionInvocationWrapper function = catalog.lookup("greeter");
assertThat(FunctionTypeUtils.isMono(function.getOutputType()));
}
public Function<String, String> uppercase() { public Function<String, String> uppercase() {
return v -> v.toUpperCase(); return v -> v.toUpperCase();
@@ -576,6 +587,15 @@ public class SimpleFunctionRegistryTests {
} }
} }
private static class ReactiveMonoGreeter implements Supplier<Mono<Message<String>>> {
@Override
public Mono<Message<String>> get() {
return Mono.just(MessageBuilder.withPayload("hello").build());
}
}
private static class HeaderEnricherFunction implements Function<Message<?>, Message<?>> { private static class HeaderEnricherFunction implements Function<Message<?>, Message<?>> {
@Override @Override