AWS Lambda и Java Reflections (Гуава) - PullRequest
1 голос
/ 13 марта 2019

Я пытаюсь запустить 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

Кто-нибудь еще сталкивался с этой проблемой?

1 Ответ

1 голос
/ 13 марта 2019

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

val cl = ClassLoader.getSystemClassLoader()

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

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

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

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

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

...