【问题标题】:Can't receive user locale in the service无法在服务中接收用户区域设置
【发布时间】:2013-05-06 18:43:20
【问题描述】:

我有两个 i18n 的属性文件,并希望在服务方法中接收本地化消息。我已经注入了messageSource,现在我只想获取用户的语言环境。

  1. 首先,我尝试通过 LocaleContextHolder.getLocale() 执行此操作,但无论请求语言环境如何,它都会返回我的系统语言环境。
  2. 然后我将HttpServletRequest 注入服务并尝试了这个:RequestContextUtils.getLocaleResolver(request).resolveLocale(request),但甚至没有收到LocaleResolver(它是空的)。

我无法将语言环境从控制器发送到该服务,因为它只是 Spring Security 的 UserDetailsService 的实现

如果重要的话,我会在我的项目中使用CookieLocaleResolver

【问题讨论】:

  • 什么决定了您要使用的语言环境?
  • @soulcheck 不太明白这个问题。我想在授权失败时显示本地化消息,所以我应该知道当前用户区域设置
  • 在这种情况下,区域设置由请求确定。您可以在控制器/身份验证拦截器中获取它并将其作为参数传递给服务。
  • 您是否将错误消息显示为 jsp 的一部分?
  • 是的,我正在显示${SPRING_SECURITY_LAST_EXCEPTION.message}。如果语言环境存储在请求中,那么向服务注入请求还不够吗?

标签: java spring internationalization locale


【解决方案1】:

一般来说,您希望将表示问题留给表示层。

在您的情况下,由于您想在 jsp 中显示消息,请在该 jsp 中使用 <spring:message />(或纯 <fmt:message />)标签,让 spring 担心 l10n。

如果您不能这样做,另一种选择是从您的服务层抛出异常并在控制器/拦截器中处理它,您可以访问ServletRequest 并因此访问用户的语言环境。

【讨论】:

  • 当然,我在我的项目中使用<spring:message/>。但是,据我了解,一般情况下,在授权期间可能会出现不同的错误,我想将其翻译并提供给 Spring Security。如何使用<spring:message/> 解决这种细微差别?
  • @vasileusky 当然,可能会发生不同类别的错误,但只有身份验证错误是特定于身份验证的,至少在 spring-security 中,您可以使用 @987654326 为该错误定义一个错误页面@
  • 感谢您的帮助!我会尝试在我的服务中抛出异常并在更高级别的某个地方处理它。
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多