6
7

More than 5 years have passed since last update.

Java - HttpServletRequestのgetLocalesメソッドの思わぬ動き

Posted at

JavaのWebアプリ開発に関わっている方にはお馴染みの
HttpServletRequestインターフェースには、HTTPリクエストヘッダーの情報を取得するための様々なメソッドが定義されています。

ご存知の方もいらっしゃると思いますが、
その中にgetLocalesというメソッドがあります。

名前から察するに、ロケール(国&言語)つまりブラウザの言語設定
(=HTTPヘッダーのAccept-Language)を取得するために使用すればよさそうですが、
想定とは違う動きを見せ、少し悩んだことがありました。


ここでやりたいこととは、
ブラウザの言語設定が取得できるか(=Accept-Languageの値が存在するか)
によって、処理を分岐させるということです。

そのため、当初は以下のようなコードで良いのではと考えました。

//① ブラウザの言語設定が取得できた場合
if (httpServletRequest.getLocales() != null) {
    // とある処理を実行
    // ・・・・

//② ブラウザの言語設定が取得できない(未設定)の場合
} else {
    // とある処理を実行
    // ・・・・
}

ところが、ブラウザの言語設定が未設定(=Accept-Languageが存在しない)の場合でも、
elseに入ることはなく、常にif内の処理が実行されることとなりました。
どうやら、getLocalesメソッドが常に何らかの結果を返却しているような動作をするようでした。

そこで、ようやくJavadocを確認しようという思いに至りました。
(初めからそうすればよかったです・・・)
HttpServletRequest#getLocales()
ここでようやく理由が判明しました。

何と、getLocalesメソッドは
「クライアントのリクエストに Accept-Language ヘッダが無い場合はサーバのデフォルトロケールを返す」
という動作を行っていたのです。
なるほど!それで何度やってもelse内には入らなかったわけです。


しかし、それでは当初の目的である
「ブラウザの言語設定が取得できるか(=Accept-Languageの値が存在するか)
によって、処理を分岐させる」
ということは、getLocalesメソッドを使って実現できないという状況となりました。

結局、以下のようなコードに変更せざるを得ませんでした。

//① ブラウザの言語設定が取得できた場合
if (httpServletRequest.getHeader("Accept-Language") != null) {
    // とある処理を実行
    // ・・・・

//② ブラウザの言語設定が取得できない(未設定)の場合
} else {
    // とある処理を実行
    // ・・・・
}

getHeaderメソッドの戻り値によって、Accept-Languageの存在チェックを行う方法です。
最終的に、最も原始的な方法で解決することになりました。

※なお、getLocaleメソッドは、厳密に言うとServletRequestに定義されていますが、本稿では馴染みのあるHttpServletRequestで話を進めてきました。

6
7
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
6
7