Как использовать spring-cloud-function-deployer с POJO в сигнатурах функций - PullRequest
0 голосов
/ 29 января 2020

У меня есть три проекта 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.

...