Kotlin

SpringBootのCharacterEncodingFilterで特定のURLパスの文字コードを変更する

Kotlin と Sprint Boot の組み合わせでアプリを作っていて、外部から Shift_JIS(SJIS)の文字コードでリクエストを受け付けないといけないケースが発生したので対応。

以前「SpringBoot(Thymeleaf)でレスポンスの文字コードを指定する」でも書いた通り、レスポンスの文字コードを変更するにはリクエスト単位でマッピング情報の produces で指定可能でした。

SpringBoot(Thymeleaf)でレスポンスの文字コードを指定する通常であればアプリケーションで使用する文字コードは 1 つだと思います。 今の時代なら「UTF-8」でしょうし、古いサイトであれば「E...

しかしリクエストについては、consumes では思った挙動にならなかったので CharacterEncodingFilter の調整に挑戦してみました。

CharacterEncodingFilterについて

Spring Boot では CharacterEncodingFilter が自動的に設定されていて「UTF-8」の文字コードが設定されます。

よって、UTF-8 の文字コードをアプリ内で扱っている分には設定ファイルなどを気にせず実装ができます。

しかし、今回の要件を満たすにはこのフィルタを調整する以外に方法が思い付きません。

極力、他には影響しないように調整したいところですが、結果的には URL のパスで分岐するしかないのかなぁっと諦めムード。

CharacterEncodingFilterを上書きする方法

いくつか CharacterEncodingFilter を上書きする方法はあるようですが、大きく参考にさせてもらったのは下記のサイトです。
(KotlinではなくてJavaのサンプルですが)

これを参考にして、以下のようなロジックを構成してみました。

参考にしたサイトでは定義はなかったのですが、@Component のアノテーションがないとインジェクションされなかったので付けています。

最後に、 @Bean アノテーションを付けて上記のフィルタクラスを読み込むようにしてみます。

この定義は Kotlin のアプリケーションクラスに追記しました。

まとめ

URL のパスによってうまく文字コードの切り替えができているのを確認していますが、まだ不備があるかもしれないのでテストしながら様子見してみます。

古いシステムを相手にしていると、文字コードが Shift_JIS というケースはまだまだたくさんあります。

大きなシステムほど移行は簡単ではないので、ずっと引きずってしまう傾向にあるのでしょうね。

それにしても、Spring Boot のアノテーション文化にはなかなか慣れないなぁ。