Класс пользователя бросил исключение: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.JsonMappingException [duplicate]

Чтобы смешать строки, переменные и переводы, я просто делаю следующее:

{% set add_link = ' <a class="btn btn-xs btn-icon-only" title="' ~ 'string.to_be_translated'|trans ~ '" href="' ~ path('acme_myBundle_link',{'link':link.id}) ~ '"> </a> ' %}

Несмотря на то, что все перемешалось, оно работает как прелесть.

117
задан Charles Menguy 26 April 2012 в 01:34
поделиться

24 ответа

Без дополнительной информации трудно определить проблему, но основная причина заключается в том, что вы, скорее всего, скомпилировали класс против другой версии класса, у которой отсутствует метод, чем тот, который вы используете при его запуске .

Посмотрите на трассировку стека ... Если исключение появляется при вызове метода на объекте в библиотеке, вы, скорее всего, используете отдельные версии библиотеки при компиляции и запуске. Убедитесь, что у вас есть правильная версия обоих мест.

Если исключение появляется при вызове метода на объектах, созданных классами , которые вы сделали , то ваш процесс сборки кажется ошибочным. Убедитесь, что файлы классов, которые вы фактически запускаете, обновляются при компиляции.

167
ответ дан Vetle 21 August 2018 в 17:44
поделиться
  • 1
    Недавно мы обнаружили причину одного из них, и выяснилось, что процесс сборки помещал файлы классов на место до того, как сервер Java был закрыт, и мы ударили его, потому что java-сервер не загрузил некоторые классы, а затем он загрузил некоторые, но он получил эти новые, и поскольку новый код ссылался на методы, которые у старых классов не было ... bingo, NoSuchMethodError – vazor 6 May 2015 в 16:30

Если ваше имя файла отличается от имени класса, которое содержит основной метод, возможно, это может быть причиной этой ошибки.

-2
ответ дан Amit Walke 21 August 2018 в 17:44
поделиться

Я столкнулся с аналогичной проблемой.

Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I

Наконец, я определил, что основной причиной было изменение типа данных переменной.

  1. Employee.java -> Содержит переменную (EmpId), тип данных которой изменен с int на String.
  2. ReportGeneration.java - -> Извлекает значение с помощью getter, getEmpId().

Мы должны отменить банку, включив только измененные классы. Поскольку изменений в ReportGeneration.java не было, я включил только файл Employee.class в Jar. Мне пришлось включить файл ReportGeneration.class в банку, чтобы решить проблему.

0
ответ дан AnonymousCoder 21 August 2018 в 17:44
поделиться

Эти проблемы вызваны использованием одного и того же объекта в тех же двух классах. Добавленные объекты не содержат нового метода, добавлен новый класс объектов.

ex:

filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) ) 
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
        at gateway.smpp.USSDClient.bind(USSDClient.java:139)
        at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
        at gateway.USSDGW.<init>(USSDGW.java:184)
        at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)

-bash-3.00$ 

Эти проблемы вызваны сопутствующим 02 аналогичным классом (1 в src , 1 в файле jar здесь gateway.jar)

1
ответ дан beresfordt 21 August 2018 в 17:44
поделиться

Если вы пишете webapp, убедитесь, что у вас нет противоречащих друг другу версий jar в каталоге глобальной библиотеки вашего контейнера, а также в вашем приложении. Возможно, вам не обязательно знать, какой jar используется загрузчиком классов.

, например.

  • tomcat / common / lib
  • mywebapp / WEB-INF / lib
2
ответ дан Cheekysoft 21 August 2018 в 17:44
поделиться

Я чувствую твою боль. Вы можете изучать программирование из книги, но когда дело доходит до работы с Eclipse или Visual Studio, его кошмар a ^ & amp; ^ & amp; n сделать что-то простое, например добавить библиотеку. Все ждут, что вы будете знать, как им пользоваться, и если вы этого не сделаете, вы можете опросить свой вопрос. Проблема в том, что если вы не работаете в офисе или не знаете кого-либо, кто может задавать эти вопросы, то почти невозможно понять это. Во всяком случае ...

У меня была твоя проблема, и именно так я ее исправил. Следующие шаги являются рабочим способом для добавления библиотеки. Я сделал первые два шага вправо, но я не сделал последнего, перетащив файл «.jar» прямо из файловой системы в папку «lib» моего проекта eclipse. Кроме того, мне пришлось удалить предыдущую версию библиотеки как из пути сборки, так и из папки «lib».

Если кто-нибудь знает более подходящий способ добавить / обновить библиотеку, пожалуйста, перезвоните.

Шаг 1 - Добавить .jar для построения пути

enter image description here [/g4]

Шаг 2 - Связанные источники и javadocs (необязательно)

enter image description here [/g5]

Шаг 3 - На самом деле перетащите файл .jar в папку «lib» (необязательно)

enter image description here [/g6]

98
ответ дан Chris Dutrow 21 August 2018 в 17:44
поделиться
  • 1
    +1 для «Все ожидают, что вы узнаете, как его использовать, и если вы этого не сделаете, вы можете опросить свой вопрос». – Vikram 19 June 2012 в 21:36

Я исправил эту проблему в Eclipse, переименовав тестовый файл Junit. В моем рабочем пространстве Eclipse у меня есть проект приложения и тестовый проект. Проект Test имеет проект App как необходимый проект на пути сборки.

Началось получение NoSuchMethodError. Затем я понял, что класс в проекте Test имеет то же имя, что и класс в проекте приложения.

App/  
  src/
     com.example/  
       Projection.java
Test/  
  src/
     com.example/
       Projection.java

После переименования теста на правильное имя «ProjectionTest.java» исключение исчезло.

0
ответ дан Dave Inlow 21 August 2018 в 17:44
поделиться

Это означает, что соответствующий метод отсутствует в классе:

  1. Если вы используете jar, тогда декомпилируйте и проверьте, имеет ли соответствующая версия jar соответствующий класс.
  2. Проверьте, не скомпилирован ли ваш класс из вашего источника.
1
ответ дан Eli Sadoff 21 August 2018 в 17:44
поделиться

Обратите внимание, что в случае отражения вы получаете NoSuchMethodException, а с неотражающим кодом вы получаете NoSuchMethodError. Я, как правило, смотрю в самых разных местах, когда сталкиваюсь с одним против другого.

56
ответ дан erickson 21 August 2018 в 17:44
поделиться

Если вы используете maven или другую фреймворк, и вы получаете эту ошибку случайно, попробуйте выполнить «чистую установку», особенно если вы написали объект и знаете, что у него есть метод. Работал для меня.

3
ответ дан HoldOffHunger 21 August 2018 в 17:44
поделиться

Это обычно возникает при использовании системы сборки, такой как Apache Ant , которая только компилирует java-файлы, когда java-файл является более новым, чем файл класса. Если подписи метода изменяются, а классы используют старую версию, вещи не могут быть скомпилированы правильно. Обычным решением является полная перестройка (обычно «ant clean», затем «ant»).

Иногда это также может быть вызвано при компиляции с одной версией библиотеки, но работает с другой версией.

9
ответ дан John Meagher 21 August 2018 в 17:44
поделиться
  • 1
    Фактически, это больше похоже на проблему, которая возникает для Java-программистов, которые используют любую инфраструктуру разработки Java: Maven, NetBeans и Apache Ant, как вы можете видеть из всех ответов здесь. – HoldOffHunger 17 March 2016 в 16:22

У меня возникла аналогичная проблема, когда я менял сигнатуры методов в своем приложении. Очистка и восстановление моего проекта разрешили «NoSuchMethodError».

0
ответ дан knorman 21 August 2018 в 17:44
поделиться

Если у вас есть доступ к изменению параметров JVM, добавление подробного вывода должно позволять вам видеть, какие классы загружаются из JAR.

java -verbose:class <other args>

Когда ваша программа запущена, JVM должна сбрасывать к стандартной информации, такой как:

...

[Загружено junit.framework.Assert из файла: / C: /Program%20Files/junit3.8.2/junit .jar]

...

36
ответ дан matt b 21 August 2018 в 17:44
поделиться
  • 1
    +1 Блестящий! Спасибо, я решил небольшую проблему, используя этот метод. Это отличный способ узнать, когда классы каким-то образом прокрались в путь к классам. – Duncan Jones 15 October 2014 в 12:59
  • 2
    +1 Ты спас мой день! Это была только одна библиотека, в которую были включены старые классы с одинаковыми именами. – Andrii Nemchenko 8 August 2018 в 18:31

Я тоже столкнулся с этой ошибкой.

Моя проблема заключалась в том, что я изменил подпись метода, например

void invest(Currency money){...}

в

void invest(Euro money){...}

Этот метод был вызван из контекста, подобного

public static void main(String args[]) {
    Bank myBank = new Bank();

    Euro capital = new Euro();
    myBank.invest(capital);
}

. Компилятор молчал в отношении предупреждений / ошибок, поскольку капитал - это как валюта, так и евро.

Проблема возникла из-за того, что я только скомпилировал класс, в котором был определен метод - Bank, но не класс, из которого вызывается метод, который содержит метод main ().

Эта проблема не является чем-то, с чем вы можете столкнуться слишком часто, так как чаще всего проект перестраивается вручную или автоматически запускается действие Build, вместо того, чтобы просто компилировать один модифицированный класс.

Мое заявление состояло в том, что я создал .jar, который должен был использоваться как исправление, которое не содержало App.class, поскольку это не было изменено. Мне было разумно не включать его, поскольку я сохранил наследование базового класса исходного аргумента.

Дело в том, что при компиляции класса полученный байт-код является видом static , другими словами, это hard-reference .

Оригинальный дизассемблированный байт-код (сгенерированный с помощью инструмента javap) выглядит следующим образом:

 #7 = Methodref          #2.#22         // Bank.invest:(LCurrency;)V

После того, как ClassLoader загружает новый скомпилированный Bank.class, он не найдет такого метода, он выглядит так, как будто он был удален и не изменен, поэтому именованная ошибка.

Надеюсь, это поможет.

0
ответ дан Mihai Savin 21 August 2018 в 17:44
поделиться

Выше ответ объясняет очень хорошо. Просто добавьте одно. Если вы используете использование eclipse, используйте ctrl + shift + T и введите структуру пакета класса (например: gateway.smpp.PDUEventListener), вы найдете все банки / проекты где он присутствует. Удалите ненужные банки из classpath или добавьте выше в путь класса. Теперь он подберет правильный.

0
ответ дан prince 21 August 2018 в 17:44
поделиться

Это также может быть результатом использования отражения. Если у вас есть код, который отражает класс, и извлекает метод по имени (например: с Class.getDeclaredMethod("someMethodName", .....)), то в любое время, когда имя метода изменяется, например, во время рефакторинга, вам нужно будет помнить, чтобы обновить параметры до метода отражения для соответствия новой сигнатуре метода, или вызов getDeclaredMethod вызовет NoSuchMethodException.

. Если это причина, то трассировка стека должна показывать точку, в которой используется метод отражения, и вы Вам просто нужно обновить параметры, чтобы они соответствовали фактической сигнатуре метода.

По моему опыту это иногда возникает при модульном тестировании частных методов / полей и использовании класса TestUtilities для извлечения полей для проверки теста. (Как правило, с устаревшим кодом, который не был разработан с учетом модульного тестирования.)

3
ответ дан rcreswick 21 August 2018 в 17:44
поделиться

Я только что решил эту ошибку, перезапустив мой Eclipse и запустив applcation. Причина моего случая может быть связана с тем, что я заменяю исходные файлы без закрытия моего проекта или Eclipse. Это вызвало разную версию классов, которые я использовал.

1
ответ дан Ryan Luo Xu 21 August 2018 в 17:44
поделиться

В большинстве случаев java.lang.NoSuchMethodError пойман компилятором, но иногда это может произойти во время выполнения. Если эта ошибка возникает во время выполнения, единственной причиной может быть изменение структуры класса, которое сделало ее несовместимой.

Лучшее объяснение: https://www.journaldev.com/ 14538 / Java-Ланг-NoSuchMethodError

0
ответ дан shmosel 21 August 2018 в 17:44
поделиться

Для меня это произошло потому, что я изменил тип аргумента в функции, от Object a, до String a. Я мог бы решить это с чистой и построить снова

1
ответ дан Tito 21 August 2018 в 17:44
поделиться

Чтобы ответить на исходный вопрос. В соответствии с java docs здесь :

«NoSuchMethodError» Брошено, если приложение пытается вызвать указанный метод класса (статический или экземпляр), а этот класс no более длинное определение этого метода.

Обычно эта ошибка улавливается компилятором; эта ошибка может возникнуть только во время выполнения, если определение класса несовместимо изменилось.

  1. Если это происходит во время выполнения, проверьте, что класс, содержащий этот метод, находится в пути к классу.
  2. Проверьте, добавлена ​​ли новая версия JAR, и метод совместим .
0
ответ дан TT. 21 August 2018 в 17:44
поделиться

Попробуйте этот путь: удалите все .class файлы в ваших каталогах проектов (и, конечно же, все подкаталоги). Rebuild.

Иногда mvn clean (если вы используете maven) не очищает файлы .class, созданные вручную javac. И эти старые файлы содержат старые подписи, что приводит к NoSuchMethodError.

1
ответ дан WHOIF 21 August 2018 в 17:44
поделиться
0
ответ дан K.K 1 November 2018 в 10:31
поделиться
0
ответ дан TT. 1 November 2018 в 10:31
поделиться
1
ответ дан Code_Mode 1 November 2018 в 10:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: