Я пытаюсь запустить отражения Гуава в моей функции AWS Lambda, но, похоже, это не работает в производстве.
Код, который я пытаюсь запустить, должен создать Map<String, Class> с именем класса и классом.
Код:
val converterClassMap by lazy {
val cl = ClassLoader.getSystemClassLoader()
ClassPath.from(cl).getTopLevelClasses("converters").asSequence().mapNotNull { it.load().kotlin }
.filter { it.simpleName?.endsWith("Converter") == true }
.associateBy( { it.simpleName }, { it } )
}
Локальный запуск этого кода работает отлично, но запуск его в рабочей среде на лямбда-выражении возвращает ошибку, когда карта пуста.
Key PaginationConverter is missing in the map.: java.util.NoSuchElementException
Кто-нибудь еще столкнулся с этой проблемой?
Хм, может быть что-то там, я должен проверить, как AWS Corretto-8 обрабатывает отражения




Еще один случай. У тебя есть
val cl = ClassLoader.getSystemClassLoader()
строка в коде. Это означает, что для сканирования классов требуется системный загрузчик классов.
Попробуйте использовать
class SomeClassFromYouCodeNotALibrary
val cl = SomeClassFromYouCodeNotALibrary::class.java.classLoader
Тот будет работать стабильно, независимо от количества загрузчиков классов, которые используются в приложении. Например, среда выполнения AWS Lambda может иметь определенные загрузчики классов.
Если это не работает, попробуйте зарегистрировать тип загрузчика классов и путь к классам, например. println(cl) и println((cl as? URLClassLoader).getURLs().joinToString(", "))
Спасибо! использовал один из моих собственных методов, который использовался, и взял этот загрузчик классов, и он работает!
Вы можете отладить, какой загрузчик классов существует при работе в среде AWS Lambda. Это может быть что-то, что не поддерживается Guava, поэтому вы вообще не видите свои классы.