diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java index ad555fd57..200c804a1 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java @@ -69,6 +69,7 @@ import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.converter.CompositeMessageConverter; +import org.springframework.messaging.support.GenericMessage; import org.springframework.messaging.support.MessageBuilder; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; @@ -668,7 +669,14 @@ public class BeanFactoryAwareFunctionRegistry } } else if (rawType instanceof Class) { // see AWS adapter with WildardTypeImpl and Azure with Voids - convertedValue = conversionService.convert(value, (Class) rawType); + try { + convertedValue = conversionService.convert(value, (Class) rawType); + } + catch (Exception e) { + if (value instanceof String || value instanceof byte[]) { + convertedValue = messageConverter.fromMessage(new GenericMessage(value), (Class) rawType); + } + } } } if (logger.isDebugEnabled()) { diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java index 55a064f9e..fbe668b8e 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java @@ -282,6 +282,16 @@ public class BeanFactoryAwareFunctionRegistryTests { assertThat((Object) catalog.lookup("")).isNull(); } + @Test + public void pojoFunctionAsJson() { + FunctionCatalog catalog = this.configureCatalog(); + Function uppercasePerson = catalog.lookup("uppercasePerson"); + + Person person = uppercasePerson.apply("{\"name\":\"bill\",\"id\":2}"); + assertThat(person.getName()).isEqualTo("BILL"); + + } + @EnableAutoConfiguration @Configuration