The function bean can be declared as a `FactoryBean`,
for example with Spring Integration's `GatewayProxyFactoryBean`.
See `LogConsumerConfiguration` in Spring Functions Catalog project.
* Fix `FunctionTypeUtils` to react to the `ParameterizedType`
and check its assignments against `Factory` bean.
Then resolves its generic to the proper target function type.
* Add `BeanFactoryAwareFunctionRegistryTests.functionFromFactoryBeanIsProperlyResolved()`
to verify that `FactoryBean<Function<?, ?>>` is resolved properly
Use the already present Jackson ObjectMapper instead to provide the same behaviour, where a value is parsed to check if it is a valid json structure, ie an array or an object.
Resolves#1173Resolves#1156
It actually no longer required. It was added when certain other auto-configurations were present that are no longer exist, so effectively it was a leftover
Resolves#1149
When a BiConsumer user function is provided, we wrap it inside a Function
when registering it in FunctionRegstration. FunctionInvocationWrapper sees
this as a Function and downstream clients (such as Spring Cloud Stream) does
not have visibility into the user function type from a FunctionInvocationWrapper
API perspective. This commit propagates the BiConsumer targer user function info
as part of FunctionInvocationWrapper API.
For more information, see: https://github.com/spring-cloud/spring-cloud-stream/issues/2670Resolves#1016
Related to https://stackoverflow.com/questions/72163534/spring-batch-integration-throwns-org-springframework-messaging-messagehandlingex
The `FunctionTypeUtils.isMessage()` fails with NPE
when target method has non-message argument with generic parameter.
Even if we instantiate the class with specific generic argument,
that info is not available for reflection and `MethodParameter`
end up with a generic parameter name which is essentially a `TypeVariable`
The stacktrace is like this:
```
java.lang.NullPointerException: Cannot invoke "java.lang.Class.getGenericInterfaces()" because "targetType" is null
at net.jodah.typetools.TypeResolver.getTypeVariableMap(TypeResolver.java:494)
at net.jodah.typetools.TypeResolver.resolveRawClass(TypeResolver.java:387)
at net.jodah.typetools.TypeResolver.resolveRawClass(TypeResolver.java:373)
at org.springframework.cloud.function.context.catalog.FunctionTypeUtils.isMessage(FunctionTypeUtils.java:416)
```