在弹簧控制器中获取区域设置的优雅方式

2022-09-03 09:50:30

我正在寻找一种更清晰的方法(在Spring 3.2中)来获取当前区域设置,而不是在每个控制器方法的开头显式调用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";
    }
}

答案 1

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";
}

答案 2

作为替代方案,您还可以自动连接HttpServletRequest

@Autowired
private HttpServletRequest request;

然后在控制器中的任何位置使用。request.getLocale()


推荐