Ответ
Алгоритм диагностики:
-
Анализ сигнатуры метода:
- Проверить точное соответствие имени, типам и порядку параметров, а также возвращаемому типу. Ошибка часто возникает из-за несовместимости версий библиотек.
// Вызов: service.process("data", 100); // Реализация в новой версии библиотеки: public void process(String data, long timeout) { ... } // int -> long
- Проверить точное соответствие имени, типам и порядку параметров, а также возвращаемому типу. Ошибка часто возникает из-за несовместимости версий библиотек.
-
Проверка версий зависимостей:
- Убедиться, что все модули проекта используют одну и ту же совместимую версию библиотеки, содержащей нужный класс. Использовать
mvn dependency:treeдля анализа.
- Убедиться, что все модули проекта используют одну и ту же совместимую версию библиотеки, содержащей нужный класс. Использовать
-
Проблемы с загрузкой классов (ClassLoader):
- В серверных приложениях (Tomcat, OSGi) разные класслоадеры могут загрузить разные версии одного класса. Изучить стектрейс для определения источника загрузки класса.
-
Обфускация/минификация (ProGuard, R8):
- Проверить правила (
-keep), чтобы критические методы и их сигнатуры не были переименованы или удалены.
- Проверить правила (
-
Динамическое проксирование (Spring AOP, AspectJ):
- Если исключение возникает при вызове метода на прокси-объекте, убедиться, что метод не
finalи неprivate, иначе он не может быть проксирован.
- Если исключение возникает при вызове метода на прокси-объекте, убедиться, что метод не
Быстрое решение:
- Внимательно изучить стектрейс: в нем указан конкретный класс и сигнатура отсутствующего метода.
- Сравнить ее с фактическим API класса, используя
javapили исходный код.