#Jakcson使おうとしてちょっとハマった。
SpringBootでトークンによる認証つきのRestfulAPIを開発中。
認証エラーが起きた時のエラーレスポンスをjacksonで行おうと思い、bulid.gradleにjacksonの設定を記述しコンパイル。しかし以下のエラーが吐かれてしまった。
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ser.std.ToStringSerializerBase
#原因究明
###1. 依存ファイルの記述が足らない?
この時点での自分のbuild.gradleは以下のようになっていた。
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.4'
しかし、このページを見てみるとどうやらjackson-databindだけではなくjackson-core、jackson-annotationも必要らしい。ということで
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.4'
implementation 'com.fasterxml.jackson.core:jackson-core:2.9.4'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.9.4'
追加。
しかし、コンパイルはうまくいかず最初のものと同じエラーが出てしまった。
困った。
###2. バージョンが古い?
頭をかきつついろいろ調べていると、今度はこのページに行き着いた。
アプリケーションの pom.xml で定義していた Jackson の version と Dropzwizard が必要とする version が異なっていたために発生していた。アプリケーションでは、2.7.4 を定義していたが、Dropwizard の最新版 1.3.4 が 依存する Version は、2.9.6 で以下の通り、pom の dependency を書き換えた。
バージョンが古いとうまくいかないことがあるらしい。
早速、「jackson version」でググってみると公式ページがヒットし、最新バージョンが2.11.2であることが判明。そこで、さらに以下のように書き換え。
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.2'
implementation 'com.fasterxml.jackson.core:jackson-core:2.11.2'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.2'
すると、うまくいった!
#まとめ
このページで筆者の方もおっしゃられている通り、
ライブラリでの、NoClassDefFoundError はほとんどは 依存ライブラリの version が古いか、新しいかのどちらかで発生するように思う。
ということだろう。しっかり最新バージョンを調べて使おう!(当たり前)
#参考文献