使用 catalog.lookup 从函数转换返回值时出现 ClassCastException

问题描述

尝试使用 Spring Cloud Functions,我创建了一个外部 jar 文件,其中包含一个如下所示的类:

Public class A implements Function<String,B>{
 Public B apply(String s){
    //...
    return instance of B;
 }
}

其中 B 是我在单独库中的自定义对象。我的应用程序(单独的 Spring Boot 应用程序)可以使用 Catalog.lookup() 从 jar 中找到正确的类并执行该函数。问题是,每当我将返回值设置为 B 时。

String s = ...
Function <String,B> function = catalog.lookup("A");
B objectB = function.apply(s); // line that causes error

我得到一个 java.lang.classCastException: 由:java.lang.classCastException: com.library.B 无法转换为 com.library.B

此应用程序还从同一个库中检索对象模型。我假设问题是由于类加载器,应用程序由一个类加载器加载,而 jar 由“FunctionArchiveDeployer”加载。反正围绕这个?还是我在这里遗漏了一些完全不同的东西?

解决方法

Caused by: java.lang.ClassCastException: com.library.B cannot be cast to com.library.B 表示同一个类被两个不同的类加载器加载两次。请记住,如果您使用 spring-cloud-function 的部署程序功能,则部署的 JAR 将在独立且专用的类加载器中执行。因此,查找返回由部署器的类加载器加载的 com.library.B,您将其转换为由应用程序类加载器加载的 com.library.B

你到底想完成什么。比如什么是业务用例?