我有三个 Maven 项目:
- demo-api:包含函数 API 的 POJO,即
OutputPojo.class, InputPojo.class
- demo-packaged-function:定义一个
public OutputPojo apply(InputPojo) {...}
依赖于“demo-api”项目的函数。 - demo-deployer:使用 spring-cloud-function-deployer 来运行打包的函数,也依赖于 'demo-api' 项目。
如果我对函数签名使用简单类型(即重构为String apply(String input) {...}
然后一切正常。但是,通过上述设置,我得到以下异常:
Exception in thread "main" java.lang.ClassCastException: class org.example.function.api.InputPojo cannot be cast to class org.example.function.api.InputPojo (org.example.function.api.InputPojo is in unnamed module of loader 'app'; org.example.function.api.InputPojo is in unnamed module of loader org.springframework.cloud.function.deployer.FunctionArchiveDeployer$1 @7fedfe27)
这是有道理的,因为类InputPojo
是由两个类加载器加载的。如果我不将函数打包为胖 jar,我会ClassNotFoundException
在尝试部署 jar 时得到,并且我无法demo-api
从部署程序项目中删除依赖项,否则在调用函数时我无法使用 POJO 类。如果没有函数的简单参数类型,这意味着如何工作?
文档没有涵盖这一点,虽然有使用 POJO 的打包函数的示例,但我找不到部署者实际调用它们的任何示例 - 除了一个单元测试,它演示类型转换并将 POJO 转换为消息.