Java 如何在函数签名中使用带POJO的spring cloud函数部署器

Java 如何在函数签名中使用带POJO的spring cloud函数部署器,java,spring-cloud-function,Java,Spring Cloud Function,我有三个maven项目: 演示api:包含函数api的POJO,即OutputPojo.class、InputPojo.class 演示打包函数:定义一个依赖于“演示api”项目的函数public OutputPojo apply(InputPojo){…} DemoDeployer:使用SpringCloudFunctionDeployer运行打包的函数,也取决于“DemoAPI”项目 如果我对函数签名使用简单类型(即重构为String apply(String input){…}),则一

我有三个maven项目:

  • 演示api:包含函数api的POJO,即
    OutputPojo.class、InputPojo.class
  • 演示打包函数:定义一个依赖于“演示api”项目的函数
    public OutputPojo apply(InputPojo){…}
  • DemoDeployer:使用SpringCloudFunctionDeployer运行打包的函数,也取决于“DemoAPI”项目
如果我对函数签名使用简单类型(即重构为
String apply(String input){…}
),则一切正常。但是,通过上述设置,我得到以下异常:

线程“main”java.lang.ClassCastException中的异常:无法将类org.example.function.api.InputPojo转换为类org.example.function.api.InputPojo(org.example.function.api.InputPojo位于加载器“app”的未命名模块中;org.example.function.api.InputPojo位于加载器org.springframework.cloud.function.deployer.FunctionArchiveDeployer$1@7fedfe27的未命名模块中)

这是有意义的,因为类
InputPojo
是由两个类加载器加载的。如果我不将函数打包为胖jar,我在尝试部署jar时会得到
ClassNotFoundException
,并且我无法从部署器项目中删除对
demo api
的依赖,否则我无法在如果函数没有简单的参数类型,这意味着什么


文档中没有介绍这一点,虽然有使用POJO的打包函数的示例,但我找不到部署人员实际调用这些函数的任何示例-除了一个是单元测试,它演示了类型转换并将POJO转换为消息。

为什么demo deployer依赖于demo api?基于我看到的demo-打包函数应依赖于demo-api。在示例中,两者都依赖于demo api,作为调用函数的委托的部署者需要知道转换为不同基础结构适配器的参数类型。即,函数定义为
public OutputPojo apply(InputPojo)
在demo打包函数中,并在部署器中作为
OutputPojo output=deployedFunction.apply(InputPojoInstance)
调用,这将不起作用,因为它必须通过类加载器边界。换句话说,我们必须将POHO实例序列化为JSON,然后作为字节[]传递然后在另一个类加载器的上下文中反序列化回同一个POJO。坦率地说,这不是部署器的用途,所以我现在想知道为什么您对显式部署感兴趣,而不是在应用程序上下文中运行函数?我想用它从不同的infra中抽象函数结构级适配器,但在某些情况下,适配器可能需要了解有关消息的详细信息,或者至少需要知道消息头,以便路由/blah。因此,我们试图围绕实际的函数负载创建一些更高级别的POJO-这可能是错误的方法,因为Spring消息传递API将消息头作为消息对象的一部分,但是目前还不清楚函数如何/是否可以提供这样的元数据(最好是以不将其与spring消息耦合的方式)。您可以使用spring,这样您就可以传递一个结构,而不用担心a)创建自己的,b)担心类装入器隔离