Я изменил тип возврата одного метода в интерфейсе в библиотеке. Раньше это было пусто, и я изменил его, чтобы вернуть объект. Я не изменял код в своем модуле, так как я не хотел ничего делать с возвращенным объектом (он был для другого модуля). Я скомпилировал мой модуль с новым банком библиотеки и провел единичные тесты, которые работали нормально, но когда я нажал банку вместе с библиотекой jar для производства и запускает модуль, я получаю java.lang.NoSuchMethodError для метода, который я изменил на интерфейсе. Я изменил интерфейс, а также реализацию, оба находятся в библиотечном банке, и я использую весенние аннотации, чтобы внедрить объект реализации в мой модуль. Какова возможная причина этой проблемы?изменение типа возвращаемого метода дает java.lang.NoSuchMethodError
ответ
Похоже, вы не перекомпилировали все или не перетащили все перекомпилированные файлы jar в prod.
Кроме того, вы не указали, перезагрузили ли вы сервер. Если у вас есть какой-то «горячий перезапуск», вам нужно тщательно настроить все загрузчики классов, чтобы все было правильно. Если вы можете полностью перезагрузить контейнер, это может помочь.
Удалили ли вы среду своего развертывания производства, поскольку кажется, что старая сигнатура метода все еще висит где-то?
Мы всегда настраиваем процесс сборки (и QA), чтобы очистить все классы и перекомпилировать именно из-за таких проблем. Иногда эвристика зависимости компилятора ошибочна (особенно если у вас есть статическое конечное поле, определенное как константа, где компилятор просто оптимизирует всю зависимость).
В этом случае, хотя код с использованием метода не изменился (фактически, потому что он не изменился), скомпилированный байт-код не разрешает правильную подпись метода и не может найти то, что он искал. На уровне байткода есть ссылка на тип возврата, который JVM просматривает и не находит.
void
не является подтипом другого типа. Поэтому, если вы измените интерфейс, чтобы вернуть тип не void
, тогда классы реализации, которые все еще возвращают void
, больше не будут совместимы с этим методом.
В байт-коде Java возвращаемый тип метода является частью сигнатуры метода и он различает два метода с тем же именем и с теми же параметрами (это то, что вы не можете сделать на языке Java). Таким образом, ваш код, который вызывает этот метод, каким-то образом не перекомпилировался и по-прежнему пытается вызвать метод, который возвращает void.
- 1. возвращаемого типа метода GetClass
- 2. Изменение возвращаемого значения метода
- 3. Изменение возвращаемого значения метода
- 4. Создание возвращаемого типа рекурсивного метода
- 5. Динамическое изменение возвращаемого типа функции
- 6. Функция типа возвращаемого типа
- 7. Именование метода в зависимости от возвращаемого типа
- 8. Вызов метода и присвоение возвращаемого типа
- 9. Метод, параметризованный методом возвращаемого типа метода
- 10. Интерфейс возвращаемого типа для реализованного метода, Ienumerator
- 11. PhpStorm: аннотация для возвращаемого типа унаследованного метода?
- 12. строка возврата из метода возвращаемого типа InputStream
- 13. метода с объектом класса возвращаемого типа
- 14. Java Reflection: получение типа возвращаемого параметра метода
- 15. типа возвращаемого значения, необходимый для перегруженного метода
- 16. Объект метода с дженериками для возвращаемого типа?
- 17. Изменение возвращаемого значения метода с атрибутом
- 18. Изменение возвращаемого типа функции в Haskell?
- 19. Изменение возвращаемого типа содержимого в Spring MVC
- 20. Изменение возвращаемого типа функции, возвращающей результат
- 21. Возвращает boolean из generic метода для типа возвращаемого типа
- 22. Задание другого типа возвращаемого типа в одном вызове метода
- 23. Изменение типа возврата метода на основе типа объектов в списке
- 24. Гибкий тип возвращаемого метода
- 25. возвращаемого типа универсальных методов
- 26. java.lang.NoSuchMethodError: Нет статического метода setOnApplyWindowInsetsListener
- 27. Запуск теста JUnit в NetBeans дает ошибку NoSuchMethodError для метода, тип возвращаемого типа которого был изменен
- 28. Изменение типа столбца Alembic дает синтаксическую ошибку
- 29. Перегрузка типа возвращаемого типа SFINAE
- 30. Почему это ковариационное декларирование возвращаемого типа не дает предупреждения?