web-dev-qa-db-ja.com

SpringControllerでロケールを取得するエレガントな方法

各Controllerメソッドの開始時にLocaleContextHolder.getLocale()を明示的に呼び出すよりも、現在のロケールを取得するためのよりクリーンな方法(Spring 3.2)を探しています。 XML構成を使用していないため、Javaアノテーションと互換性がある必要があります。現在行っていることは次のとおりです。

@Controller
public class WifeController {
    @Autowired
    private MessageSource msgSrc;

    @RequestMapping(value = "/wife/mood")
    public String readWife(Model model, @RequestParam("whatImDoing") String iAm) {
        Locale loc = LocaleContextHolder.getLocale();
        if(iAm.equals("playingXbox")) {
            model.addAttribute( "statusTitle", msgSrc.getMessage("mood.angry", null, loc) );
            model.addAttribute( "statusDetail", msgSrc.getMessage("mood.angry.xboxdiatribe", null, loc) );
        }
        return "moodResult";
    }
}
11
yetimoner

Spring 3.2リファレンスドキュメント 、セクション17.3.3、サポートされているメソッド引数タイプ:

サポートされているメソッド引数は次のとおりです。

  • 要求または応答オブジェクト(サーブレットAPI)。 ServletRequestやHttpServletRequestなど、特定の要求または応答タイプを選択します。

    (...)

  • Java.util.Localeは、使用可能な最も具体的なロケールリゾルバー、実際にはサーブレット環境で構成されたLocaleResolverによって決定されます。

したがって、必要なのは、すべてのメソッドの引数としてLocaleのインスタンスを受け取ることだけです。

@RequestMapping(value = "/wife/mood")
public String readWife(Model model, @RequestParam("whatImDoing") String iAm, Locale loc) {
    if (iAm.equals("playingXbox")) {
        model.addAttribute("statusTitle", msgSrc.getMessage("mood.angry", null, loc));
        model.addAttribute("statusDetail", msgSrc.getMessage("mood.angry.xboxdiatribe", null, loc));
    }
    return "moodResult";
}

別の方法として、HttpServletRequestを自動配線することもできます

_@Autowired
private HttpServletRequest request;
_

次に、コントローラーのあらゆる場所でrequest.getLocale()を使用します。

0
yglodt