各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";
}
}
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()
を使用します。