どうも新米エンジニアのnoyです。
ServletとAjaxを使って非同期通信できるwebアプリを作っているのですが、
エラー解決に少々時間がかかったので記録を残します。
開発環境
エディター:Eclipse 2019-03 (4.11.0)
Webサーバー:Apache Tomcat v9.0
言語:Java
ライブラリ:
・jquery-3.4.1.min.js
・jackson-annotations-2.9.9.jar
・jackson-core-2.9.9.jar
・jackson-databind-2.9.9.jar
#エラー内容
Servletからajaxにレスポンスを返そうとしたところ、HTTPステータス 500 – Internal Server Errorが発生
「500エラーってなに?!」となり、わんやわんやと少々時間を潰してしまいましたが、
エラーをクリックしていくと例外報告を発見。 「根本原因 java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper」あれ?ObjectMapperを定義しているファイルはimportしてるはずなんだけど....
そう思いながらEclipseを色々見直してると「問題」タブで以下の警告を発見。
あれ、クラスパスに追加してるはずのjackson-XXXXXX-2.9.9.jarファイルが参照されてないのかも...?
#原因
ObjectMapper(Jacksonのクラス)が定義されているファイル(jackson-XXXXXX-2.9.9.jar)を参照することができず、java.lang.NoClassDefFoundErrorとなっているため。
※ Jacksonとは…Java用のJSONパーサーライブラリの1つ。JavaオブジェクトとJSONの相互変換ができる。
ということで「eclipse クラスパス・エントリー は、エクスポートまたは公開されません。」でググってみたところ、以下のページを見て解決できました。
https://codeday.me/jp/qa/20190201/208565.html
「spring-mvc – Eclipseの警告:XXXXXXXXXXX.jarはエクスポートまたは公開されません。ランタイムClassNotFoundExceptionsが発生する可能性があります」
#解決策
jackson-XXXXXX-2.9.9.jarファイルを参照ライブラリーから削除し、WEB-INF / libフォルダに直接格納する。
参照ライブラリーにある、3つのjackson-XXXXXX-2.9.9.jarファイルを「ビルド・パスから除外」で削除。
WebContent/WEB-INF/libフォルダに3つのjackson-XXXXXX-2.9.9.jarファイルを直接ドラッグ&ドロップ。
「ファイルをコピー」を選択して「OK」
ファイルが格納されました。
3つのjackson-XXXXXX-2.9.9.jarファイルに関する警告が消えています。(今は残り2項目については無視)
500エラーも消えてServletが実行できました。