From c4dfffe0bac5b0d6924d0a868d5757c3c32debee Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 5 Feb 2021 16:03:45 +0100 Subject: [PATCH] GH-640 Fix NPE with non-Message json conversion Resolves #640 Added test --- .../catalog/SimpleFunctionRegistry.java | 6 ++--- .../catalog/SimpleFunctionRegistryTests.java | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java index 184f3a569..7ec7ced57 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java @@ -1001,10 +1001,10 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect && SimpleFunctionRegistry.this.conversionService.canConvert(input.getClass(), rawInputType)) { convertedInput = SimpleFunctionRegistry.this.conversionService.convert(input, rawInputType); } - if (convertedInput == null && input.getClass().isAssignableFrom(rawInputType)) { - convertedInput = input; + if (convertedInput == null && logger.isDebugEnabled()) { + logger.debug("Failed to convert input '" + input + "' to type " + inputType + ". Will use it as is."); } - return convertedInput; + return convertedInput == null ? input : convertedInput; } /* diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java index 08ab41934..4dc8451d6 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java @@ -86,6 +86,21 @@ public class SimpleFunctionRegistryTests { this.conversionService = new DefaultConversionService(); } + @Test + public void testSCF640() { + Echo function = new Echo(); + FunctionRegistration registration = new FunctionRegistration<>( + function, "echo").type(FunctionType.of(Echo.class)); + SimpleFunctionRegistry catalog = new SimpleFunctionRegistry(this.conversionService, this.messageConverter, + new JacksonMapper(new ObjectMapper())); + catalog.register(registration); + + FunctionInvocationWrapper lookedUpFunction = catalog.lookup("echo"); + Object result = lookedUpFunction.apply("{\"HELLO\":\"WORLD\"}"); + assertThat(result).isNotInstanceOf(Message.class); + assertThat(result).isEqualTo("{\"HELLO\":\"WORLD\"}"); + } + @SuppressWarnings("unchecked") @Test public void testSCF588() { @@ -468,6 +483,15 @@ public class SimpleFunctionRegistryTests { } + private static class Echo implements Function { + + @Override + public Object apply(Object t) { + return t; + } + + } + private static class UpperCaseMessage implements Function, Message> {