LoginSignup
4
3

More than 3 years have passed since last update.

SpringBootでJacksonを使おうとしてちょっとハマった

Posted at

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 が古いか、新しいかのどちらかで発生するように思う。

ということだろう。しっかり最新バージョンを調べて使おう!(当たり前)

参考文献

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3