2

私はEclipseでプロジェクトに取り組んでおり、jettyプラグインを使用して起動すると

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 コンパイラーのジェネリックに関するバグ (このクラスはジェネリックを使用します) についてオンラインで何かを読みましたが、この基本クラス/インターフェースはコード ベースで何度も再実装されており、常に問題を抱えているのはこのクラスです。

誰かがこの問題の回避策、またはさらに良い解決策を知っていますか?

この例外は毎回再現できます。Eclipse コンパイラの開発者がこれを読んで、これが既知の問題である場合は、問題を追跡するための支援が必要な場合は、遠慮なく私に連絡してください。

アップデート:

GenericDAO問題のあるクラスは、Generic インターフェイスが次のように定義されている場所を実装する多くのクラスの 1 つです。

public interface GenericDAO<T, TList> 

失敗している問題のメソッドは次のとおりです。

public T findById(Integer integer) throws APIException;   
4

7 に答える 7

6

コードを再構築してみてください。

あなたはDAOインターフェースを持っていると思いますが、インターフェースとimplのシグニチャーはわずかに異なるため、コンパイラーはインターフェースが具体的なimplクラスによって完全に実装されているとは見なしません。たぶんEclipseは同期していません。

それでもうまくいかない場合は、Eclipseでインターフェースメソッドから具体的な実装に移動できるかどうかを確認してください。それができない場合、それはコンパイラーがあなたに言っていることを補強する手がかりです。

CLASSPATHを確認してください。たぶん、JVMによってロードされていると思うimplはそうではありません。

コンパイラに問題があると思われる場合は、バグリストを確認してください。

リストにバグが表示されない場合は、自分が問題であると想定してください。多くの人がそれを使用しています。深刻なバグが発見され、ずっと前に修正されていたでしょう。

Jettyデプロイメント(WARおよびすべての一時ファイル)をクリーンアップします。再構築して再デプロイします。たぶん、Jettyは古いバージョンの.classファイルを保持しています。これは、Webにデプロイするときではなく、コマンドラインで機能する理由を説明しています。

あなたが最初、最後、そして常に問題であると仮定します。

更新:Eclipseが使用するJDKを切り替える方法はありますか?Sun JDKを指していただけますか?

これが、私がEclipseを嫌うもう1つの理由です。あなたの話が本当なら、IntelliJユーザーになることは私をさらに幸せにするでしょう。

質問:IBMの汎用DAOを実装していますか?

于 2009-07-24T00:51:36.600 に答える
1

内部織りを無効にしてみてください:( eclipselink.weaving.internal=falsepersistence.xmlで)

于 2012-06-18T22:08:19.223 に答える
0

クラスパスを見てください。
インターフェイス名が別のパッケージのクラスパスに沿って複製されている可能性があります。そして、その日食は自動的に間違ったパッケージをインポートしました。

それが起こったとき、私は私の髪を引き裂くのにかなりの時間を費やしました/ +:

すでに解決策がある場合は、ここにも投稿していただけますか?

于 2009-08-07T12:54:17.623 に答える
0

プロジェクトをきれいにしてから、プロジェクトをビルドします。エラーが消えました。eclipseの初心者として
、IDE は子供のようなものだと思います。

于 2013-04-23T10:02:04.867 に答える
0

コードをナビゲートでき、すべて問題なくチェックアウトできるとすでにおっしゃっていましたが、デバッグ中にナビゲートしてみましたか? findById が呼び出される直前にブレークしてからステップインすると、Impl クラスに到達しますか? これにより、クラスパスの混同の可能性についてのヒントが得られるかもしれません...

于 2009-08-04T09:33:03.440 に答える
0

@Override アノテーションは役に立ちますか? これをコンパイル時のエラーに変えることができれば、問題に関する詳細情報を取得できる可能性があります。

問題のファイル内の関連するクラス名を完全に修飾することもお勧めします。

于 2009-08-07T20:39:05.933 に答える
0

Sunコンパイラを使用してコマンドラインから正常に実行されると言うので、EclipseとSunコンパイラの両方がクラスを同じディレクトリに出力していると思いますか?

Eclipse と Sun コンパイラの両方を使用している場合、クラス ファイルの同期を維持することに問題があると思われる同様の問題がありました。Eclipse は、Sun コンパイラの代わりに独自のビルトイン コンパイラを使用します。これにより、同じコードに対して異なるクラス ファイルが生成されます (たとえば、シリアル バージョンの UID が一致しません)。

私が見つけた最善の解決策は、Eclipse と Sun コンパイラーに別々の bulid フォルダーを使用することです。このようにして、ソースは常に同期されますが、クラス ファイルが互いに競合することはありません。

于 2009-08-06T22:27:34.263 に答える