AWS Lambda и Java Reflections (Guava)

Я пытаюсь запустить отражения Гуава в моей функции 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 Lambda. Это может быть что-то, что не поддерживается Guava, поэтому вы вообще не видите свои классы.

Eugene Petrenko 13.03.2019 16:20

Хм, может быть что-то там, я должен проверить, как AWS Corretto-8 обрабатывает отражения

Oreex0 13.03.2019 16:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Еще один случай. У тебя есть

val cl = ClassLoader.getSystemClassLoader()

строка в коде. Это означает, что для сканирования классов требуется системный загрузчик классов.

Попробуйте использовать

class SomeClassFromYouCodeNotALibrary
val cl = SomeClassFromYouCodeNotALibrary::class.java.classLoader

Тот будет работать стабильно, независимо от количества загрузчиков классов, которые используются в приложении. Например, среда выполнения AWS Lambda может иметь определенные загрузчики классов.

Если это не работает, попробуйте зарегистрировать тип загрузчика классов и путь к классам, например. println(cl) и println((cl as? URLClassLoader).getURLs().joinToString(", "))

Спасибо! использовал один из моих собственных методов, который использовался, и взял этот загрузчик классов, и он работает!

Oreex0 13.03.2019 16:57

Другие вопросы по теме