2009-07-24 2 views
2

Я работаю над проектом в затмении, что, когда я запускаю с помощью причала плагина дает мнеjava.lang.AbstractMethodError запускает webapp в Eclipse с причалом.

java.lang.AbstractMethodError: 
au.com.mycopmpany.impl.MyClassDAOImpl.findById(Ljava/lang/Integer;)Ljava/lang/Object;. 

Этот файл отлично компилируется в Eclipse, и код реализует метод, что переговоры об ошибках,. Из моего чтения эта ошибка указывает, что «во время выполнения» JVM находит класс, который не реализовал этот метод.

Но могу вас заверить, что у MyClassDAOImpl определенно есть метод findById, реализованный с правильной подписью.

Это похоже на ошибку в компиляторе Eclipse; Я могу исправить проблему, запустив maven package из командной строки, а затем запустить приложение в Eclipse отлично.

Кажется, что компилятор Eclipse имеет какую-то ошибку в отношении этого класса. Я прочитал что-то в сети о ошибке с генериками в компиляторе Eclipse (который этот класс использует Generics), но этот базовый класс/интерфейс повторно внедряется снова и снова в нашей базе кода, и этот класс всегда имеет проблемы.

Кто-нибудь знает обходное решение или, еще лучше, решение этой проблемы?

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

Update:

Класс с проблемой является одним из многих, которые реализуют GenericDAO, где Общий интерфейс определяется как:

public interface GenericDAO<T, TList> 

рассмотренный метод, который неисправного является:

public T findById(Integer integer) throws APIException; 
+1

Что представляет собой базовый класс или интерфейс, объявляющий параметр как; Целое, или что-то в цепочке, как Serializable? Мне интересно, генерирует ли он код, который требует что-то выше (например, Serializable) для параметра, но он получает Integer и каким-то образом не понимает, что он реализует Serializable. – lumpynose

+1

Возможно, вам нужно объявить тип параметра id с помощью super или extends? Например, открытый абстрактный класс BaseDao > Обратите внимание, что я просто колоть в темноте и гадать. – lumpynose

+0

Lumpynose - Это может быть решением, и я попробую, но есть еще 30 классов, реализующих этот интерфейс, и они отлично работают. – stevemac

ответ

6

Попробуйте перестроить свой код.

Я предполагаю, что у вас есть интерфейс DAO, а сигнатуры интерфейса и имплантата несколько отличаются, что компилятор не видит интерфейса, полностью реализованного конкретным классом impl. Возможно, Eclipse не синхронизирован.

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

Проверьте свой CLASSPATH. Возможно, имп, который, по вашему мнению, загружается JVM, нет.

Проверьте список ошибок, если вы считаете, что это проблема с компилятором.

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

Очистите развертывание Jetty - WAR и все временные файлы. Перестроить и переустановить. Возможно, Jetty держит старую версию файла .class, что объясняет, почему оно работает в командной строке, а не при развертывании в Интернете.

Предположим, что это проблема первая, последняя и всегда.

UPDATE: Есть ли способ переключить JDK, который использует Eclipse? Можете ли вы указать на Sun JDK?

Это еще одна причина, по которой я ненавижу Eclipse. Ваша история, если это правда, сделало бы меня еще более счастливым быть пользователем IntelliJ.

Вопрос: Вы внедряете IBM's generic DAO?

+0

Я согласен, что если бы это было проблемой, я бы нашел больше информации об этом.Мой указатель, который говорит, что что-то не так в eclipse, заключается в том, что я могу перемещаться по коду, и все это хорошо, и я могу скомпилировать из командной строки, а затем RUN в eclipse (используя классы компилятора солнца), ничего не меняя, и он работает. Пока я не внес изменения в этот класс, который требует, чтобы eclipse перекомпилировал его, код работает нормально. – stevemac

+0

@duffymo Я знаю его старый поток, но я получаю ту же ошибку и использую общий DAO IBM. –

0

Я знаю, что вы уже сказали, что можете перемещаться по коду, и все это проверяет ОК, но вы пробовали навигацию во время отладки? Если вы сломались перед вызовом findById, а затем входите в свой класс Impl? Это может дать вам некоторые подсказки о возможных путях смешения классов ...

+0

Вы правы, навигация во время выполнения дает мне классы без источника, но я могу правильно перемещаться во время компиляции. – stevemac

0

Вы говорите, что он отлично работает из командной строки с использованием компилятора Sun, поэтому я предполагаю, что оба компилятора Eclipse и Sun выводят их классы в один и тот же каталог?

У меня были аналогичные проблемы, где, похоже, возникла проблема с сохранением файлов классов в синхронизации при использовании как Eclipse, так и компилятора Sun. Eclipse использует собственный встроенный компилятор вместо компилятора Sun, и это приведет к созданию разных файлов классов для одного и того же кода (например, UID с последовательной версией не совпадают).

Лучшим решением, которое я нашел, является использование отдельной папки bulid для Eclipse и компилятора Sun. Таким образом, ваш источник, если он всегда синхронизирован, но файлы классов не могут конфликтовать друг с другом.

0

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

Я потратил много времени, рву на себе волосы, когда это случилось/+:

Если у вас уже есть решение, не могли бы вы разместить его здесь?

0

Является ли @Override аннотацией какой-либо помощи? Возможно, вы сможете получить дополнительную информацию о проблеме, если вы можете превратить это в ошибку времени компиляции.

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

1

Попробуйте отключить внутреннюю плетение: (eclipselink.weaving.internal=false в persistence.xml)

0

Просто очистить проект, а затем Maven построить проект. Ошибка исчезла. Как новичок
, чтобы затмить, я думаю, что IDE похожа на ребенка, у вас должно быть терпение, чтобы встретить нестабильность.

Смежные вопросы