続・ロケール(java.util.Locale)を軽くいじる

前回の続き。

影響度 設定範囲
OS(シェル)
Java -Dオプション
ここらへんで解決したい!

ってことで、Spring Frameworkでは、こんなインタフェースがあったりするようで。

実装クラスが数クラスあるようです。
例えば、

の場合、

Default is the current JVM's default locale.

とあるので、Javaのデフォルトロケールを解決してくれますね。
ただ・・・APIが悩ましい(ー”ー;

public Locale resolveLocale(HttpServletRequest request)

HttpServletRequestを与える必要があるようで(汗)。サーブレットを介する処理用ってことですかね。
なんのためにリクエストが必要なんだろ?ってことで、ソースを拝むと、

public class FixedLocaleResolver extends AbstractLocaleResolver {

	/**
	 * Create a default FixedLocaleResolver, exposing a configured default
	 * locale (or the JVM's default locale as fallback).
	 * @see #setDefaultLocale
	 */
	public FixedLocaleResolver() {
	}

	/**
	 * Create a FixedLocaleResolver that exposes the given locale.
	 * @param locale the locale to expose
	 */
	public FixedLocaleResolver(Locale locale) {
		setDefaultLocale(locale);
	}


	public Locale resolveLocale(HttpServletRequest request) {
		Locale locale = getDefaultLocale();
		if (locale == null) {
			locale = Locale.getDefault();
		}
		return locale;
	}

	public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
		throw new UnsupportedOperationException(
				"Cannot change fixed locale - use a different locale resolution strategy");
	}

}

HttpServletRequestを参照していなかった。へぇ・・・って感じです。
代わりに、 

  • getDefaultLocale()で解決できなかったら、Locale.getDefault()を返す。
  • AbstractLocaleResolver#getDefaultLocale()では、
public abstract class AbstractLocaleResolver implements LocaleResolver {

	private Locale defaultLocale;

	/**
	 * Set a default Locale that this resolver will return if no other locale found.
	 */
	public void setDefaultLocale(Locale defaultLocale) {
		this.defaultLocale = defaultLocale;
	}

	/**
	 * Return the default Locale that this resolver is supposed to fall back to, if any.
	 */
	protected Locale getDefaultLocale() {
		return this.defaultLocale;
	}

}

自身のプロパティ(defaultLocale)を返すだけ。
であれば、FixedLocaleResolverをBean定義してあげて、Bean定義時に

  • defaultLocaleを指定しなかったら、(Java -Dオプション|OS(シェル))から取得。
  • defaultLocaleを指定したら、指定したロケール

を個別に指定できそうですね。

いじょ

関連記事: