概要
Spring bootの全リクエスト共通で空白文字列を削除する時に、よくinitBinderを利用してtrim()処理を入れる記事などはある。しかしRest APIの場合はJacksonの設定を上書きし、jsonをデシリアライズする前に処理を入れる事によって実現が可能である。
- Spring boot 2.1.5
- Kotlin 1.3
試行錯誤
Spring bootの全リクエスト共通でtrim処理を入れたい時に、よくinitBinderを利用して全リクエスト共通で処理を入れる記事がある。
試したところRest APIでは利用できないようだ。(こちらの 記事をみているあたりinitBinderはModelAttributeメソッドを利用する時のみ実行される?)
で次に試したのが該当のメンバ変数のsetterに @JsonDeserialize
をつける方法だ。
https://stackoverflow.com/questions/6852213/can-jackson-be-configured-to-trim-leading-trailing-whitespace-from-all-string-pr
Kotlinではgetter/setterが自動で作成される為、カスタムsetterを作成するのも難儀なので断念。
で今回紹介するのはJacksonのModule作成機能を利用する方法です。
デシリアライザの作成と登録
SimpleModuleを継承したクラスを作成し、デシリアライザを作成する。
今回はStringクラスのみ対象とし、when文で対象のプロパティのみtrim()する。
@Component
class StringTrimModule : SimpleModule() {
init {
this.addDeserializer(String::class.java, object : StdScalarDeserializer<String>(String::class.java) {
override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): String? {
val stringValue = p?.valueAsString
return when (p?.currentName) {
"username", "mail_address" -> {
stringValue?.trim()
}
else -> {
stringValue
}
}
}
})
}
}
(参考)
https://gist.github.com/goeh/b542c7c02462ff4a7a8c
https://sites.google.com/site/soracane/home/springnitsuite/spring-mvc/04-ji-ben-gai-nian-controllerno-chu-lifuro