在Spring Controller中获取Locale的优雅方法

我正在寻找一种更清晰的方式(在Spring 3.2中)获取当前语言环境,而不是在每个Controller方法的开头显式调用LocaleContextHolder.getLocale()。 它必须与Java注释兼容,因为我没有使用XML配置。 这就是我目前正在做的事情。

@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节,支持的方法参数类型:

以下是受支持的方法参数:

  • 请求或响应对象(Servlet API)。 选择任何特定的请求或响应类型,例如ServletRequest或HttpServletRequest。

    (……)

  • 当前请求语言环境的java.util.Locale ,由最可用的语言环境解析器确定,实际上是Servlet环境中配置的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"; } 

作为替代方案,您还可以自动assemblyHttpServletRequest

 @Autowired private HttpServletRequest request; 

然后在Controller中的任何地方使用request.getLocale()