Spring Cloud Function中Kotlin函数调用如何传递多个参数
Spring Cloud Function Kotlin多参数传递方案
双入参函数定义的支持情况
Spring Cloud Function 原生不支持直接定义2个及以上入参的函数式Bean,你写的如下双入参写法无法被框架正常识别路由:
@Bean open fun upper(): (String,String) -> String = { x,y -> x+y }
框架核心的函数契约只适配三类标准签名:0入参的Supplier<T>、1入参1出参的Function<T,R>、1入参无出参的Consumer<T>,多入参的Lambda无法被框架绑定为可调用的端点,启动后调用会抛出参数适配异常,也不支持直接通过URL路径匹配多个路径参数传入。
对象入参的支持情况
传入对象作为入参是完全可行的,你写的Pair<String,String>作为入参的写法可以正常使用,这也是官方推荐的多参数传递实现方式。
具体调用方式
- 如果你使用POST请求调用:直接将多个参数封装为JSON格式放在请求体中,请求发到函数对应的路径即可,框架会自动完成JSON到入参对象的反序列化。以上面的Pair入参函数为例,向
http://localhost/upper发送POST请求,请求体传入{"first":"foo","second":"bar"},就能拿到拼接后的返回结果foobar。 - 如果你使用GET请求调用:更推荐自定义语义清晰的Kotlin数据类作为入参,框架会自动将URL中的查询参数绑定到对象属性上,示例代码如下:
// 自定义参数接收实体 data class ConcatArgs( val left: String, val right: String ) @Bean open fun upper(): (ConcatArgs) -> String = { it.left + it.right }
调用时直接拼查询参数即可:http://localhost/upper?left=hello&right=world,不需要额外做参数绑定配置。
注:Kotlin内置的Pair、Triple元组类虽然可以正常被框架序列化、反序列化,但业务场景下优先使用自定义data class,字段语义更明确,后续扩展参数也更方便。
内容的提问来源于stack exchange,提问作者PaulNUK
相关产品推荐
相关产品推荐

