У меня есть три проекта maven:
- demo-api: содержит POJO для API функций, т.е.
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
загружается обоими загрузчиками классов. Если я не упаковываю функцию как толстую банку, я получаю ClassNotFoundException
при попытке развернуть банку, и я не могу удалить зависимость от demo-api
из проекта развертывания, так как в противном случае я не могу использовать классы POJO при вызове функции. Как это должно работать без простых типов аргументов для функций?
Документация не охватывает это, и хотя есть примеры упакованных функций, использующих POJO, я не могу найти никаких примеров того, как они на самом деле вызываются развертывателем - кроме одного - модульные тесты, которые демонстрируют преобразование типов и преобразуют POJO в Message.