diff --git a/spring-cloud-function-kotlin/pom.xml b/spring-cloud-function-kotlin/pom.xml
index 75a9248d0..fa3452b5d 100644
--- a/spring-cloud-function-kotlin/pom.xml
+++ b/spring-cloud-function-kotlin/pom.xml
@@ -41,7 +41,15 @@
kotlin-maven-plugin
org.jetbrains.kotlin
- 1.2.71
+ 1.4.21
+
+
+ -Xjsr305=strict
+
+
+ spring
+
+
compile
@@ -68,6 +76,13 @@
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-allopen
+ 1.4.21
+
+
org.apache.maven.plugins
diff --git a/spring-cloud-function-kotlin/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java b/spring-cloud-function-kotlin/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java
index 739dc0420..5e9371007 100644
--- a/spring-cloud-function-kotlin/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java
+++ b/spring-cloud-function-kotlin/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2019 the original author or authors.
+ * Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,6 +36,7 @@ import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@@ -62,7 +63,6 @@ public class KotlinLambdaToFunctionAutoConfiguration {
protected final Log logger = LogFactory.getLog(getClass());
-
/**
* Will transform all discovered Kotlin's Function lambdas to java
* Supplier, Function and Consumer, retaining the original Kotlin type
@@ -71,7 +71,7 @@ public class KotlinLambdaToFunctionAutoConfiguration {
* @return the bean factory post processor
*/
@Bean
- public BeanFactoryPostProcessor kotlinToFunctionTransformer() {
+ public BeanFactoryPostProcessor kotlinToFunctionTransformerOld() {
return new BeanFactoryPostProcessor() {
@Override
@@ -82,14 +82,17 @@ public class KotlinLambdaToFunctionAutoConfiguration {
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanDefinitionName);
- ResolvableType rt = beanDefinition.getResolvableType();
- if (rt.getType().getTypeName().startsWith("kotlin.jvm.functions.Function")) {
- RootBeanDefinition cbd = new RootBeanDefinition(KotlinFunctionWrapper.class);
- ConstructorArgumentValues ca = new ConstructorArgumentValues();
- ca.addGenericArgumentValue(beanDefinition);
- cbd.setConstructorArgumentValues(ca);
- ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(beanDefinitionName + FunctionRegistration.REGISTRATION_NAME_SUFFIX, cbd);
+ if (beanDefinition instanceof AnnotatedBeanDefinition && ((AnnotatedBeanDefinition) beanDefinition).getFactoryMethodMetadata() != null) {
+ String typeName = ((AnnotatedBeanDefinition) beanDefinition).getFactoryMethodMetadata().getReturnTypeName();
+ if (typeName.startsWith("kotlin.jvm.functions.Function")) {
+ RootBeanDefinition cbd = new RootBeanDefinition(KotlinFunctionWrapper.class);
+ ConstructorArgumentValues ca = new ConstructorArgumentValues();
+ ca.addGenericArgumentValue(beanDefinition);
+ cbd.setConstructorArgumentValues(ca);
+ ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(beanDefinitionName + FunctionRegistration.REGISTRATION_NAME_SUFFIX, cbd);
+ }
}
+
}
}
};
diff --git a/spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java b/spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java
index 2e84e86f1..090a303d8 100644
--- a/spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java
+++ b/spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java
@@ -93,6 +93,14 @@ public class ContextFunctionCatalogAutoConfigurationKotlinTests {
.lookup(Function.class, "javaFunction");
assertThat(javaFunction.apply("Hello"))
.isEqualTo("Hello");
+
+ // Function f = (Function) this.context.getBean("kotlinPojoFunction");
+ assertThat(this.context.getBean("kotlinPojoFunction")).isInstanceOf(Function1.class);
+ assertThat((Function, ?>) this.catalog.lookup(Function.class, "kotlinPojoFunction")).isInstanceOf(Function.class);
+ assertThat(this.inspector.getInputType(this.catalog.lookup(Function.class, "kotlinPojoFunction")))
+ .isAssignableFrom(Person.class);
+ assertThat(this.inspector
+ .getOutputType(this.catalog.lookup(Function.class, "kotlinFunction"))) .isAssignableFrom(String.class);
}
private void create(Class>[] types, String... props) {
diff --git a/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt b/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt
index a8271a1e7..6c9063f3c 100644
--- a/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt
+++ b/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt
@@ -27,24 +27,29 @@ import java.util.function.Function
*/
@EnableAutoConfiguration
@Configuration
-open class KotlinLambdasConfiguration {
+class KotlinLambdasConfiguration {
@Bean
- open fun kotlinFunction(): (String) -> String {
+ fun kotlinFunction(): (String) -> String {
return { it.toUpperCase() }
}
+
+ @Bean
+ fun kotlinPojoFunction(): (Person) -> String {
+ return { it.name.toString()}
+ }
@Bean
- open fun kotlinConsumer(): (String) -> Unit {
+ fun kotlinConsumer(): (String) -> Unit {
return { println(it) }
}
@Bean
- open fun kotlinSupplier(): () -> String {
+ fun kotlinSupplier(): () -> String {
return { "Hello" }
}
@Bean
- open fun javaFunction(): Function {
+ fun javaFunction(): Function {
return Function { x -> x }
}
}
diff --git a/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/Person.kt b/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/Person.kt
new file mode 100644
index 000000000..130b07f5a
--- /dev/null
+++ b/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/Person.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2012-2021 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.function.kotlin
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import java.util.function.Function
+
+/**
+ * @author Oleg Zhurakousky
+ *
+ */
+class Person {
+
+ var name:String? = null;
+
+
+}