如何从Spring获取当前用户语言环境而不将其作为参数传递给函数?


70

我正在使用Spring 3.1,并且想找到当前用户有效的语言环境,有没有一种方法可以直接获取语言环境,而不必强制将其从控制器传递给服务层...等等。

spring是否将语言环境存储在线程本地存储中,可以通过调用某些静态方法来获取它?

Answers:


153

我也一直在寻找如何在不经过环境的情况下访问语言环境的方法Locale,但是我对Spring还是很陌生,发现大多数解决方案令人困惑。但是事实证明,Spring MVC确实将语言环境存储在线程本地存储中。可以通过以下方式访问它:

Locale locale = LocaleContextHolder.getLocale();

最后一种方法是基于线程本地的,以便在体系结构的任何实体中提供当前的语言环境。[...]您必须注意,默认情况下,LocaleContextHolder的内容对应于Web请求中指定的语言环境。

来自:使用Spring MVC 3配置语言环境切换。(该文章还提供了用于获取语言环境的替代配置/方法,这对于希望这样做的任何人可能都是有用的)。

您也可以在此处查看LocaleContextHolderSpring的文档。


1
也为我工作,这里是LocaleContextHolder的方法列表docs.spring.io/spring/docs/current/javadoc-api/org/...
费德里科Traiman

5

这取决于您配置为在会话中还是在cookie中存储区域设置的位置?

在我的应用程序中,我已经配置为使用以下提到的配置在其会话中存储用户区域设置。

    <mvc:interceptors>
        <ref bean="localeChangeInterceptor"/>
    </mvc:interceptors>

    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="lang"/>
    </bean>

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
        <property name="defaultLocale" value="en"/>
    </bean>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
        <list>
            <value>/WEB-INF/i18n/labels</value>
            <value>/WEB-INF/i18n/messages</value>
            <value>/WEB-INF/i18n/include</value>
        </list>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

如果您已完成上述操作,则可以轻松地从会话中检索locale参数。

希望这对您有所帮助。

干杯。


Japs这对我没有帮助,因为我想了解服务中的语言环境,并且我不想将语言环境传递给Service方法,我希望能够调用静态函数并为用户获取当前语言环境,由配置的任何语言环境解析器解析。通常,您只需要为Annotation控制器定义Locale类型的参数即可,它为解析的语言环境提供了我不想将语言环境参数添加到较低层的功能,我只想从线程语言环境获取它。
2012年

在这种情况下,您还可以自动连接服务中的localeResolver bean,然后可以调用class方法来确定用户在会话中设置的当前语言环境。
日本Trivedi

注入LocaleResolver不起作用,因为LocaleResolver需要对httpServletRequest或Response进行访问,因此我必须将这些传递给服务层,这不是我想要的。
2012年

在这种情况下,别无选择,只能在控制器中获取语言环境,然后将其作为参数传递给服务。我看不到您想要的语言环境的任何其他可能性。
日本Trivedi

2

我们有同样的需要,所以有把想出了LocaleThreadLocal上下文。我们已经在ThreadLocal上下文中存储了一个对象(一些用户信息),因此只需将其附加(看起来像hack,但是我们找到的最快的解决方案)。


6
这正是这样LocaleContextHolder做的:将int存储LocaleThreadLocal变量中。无需使用自定义hack(因为Spring已经为您完成了该hack)。
cr7pt0gr4ph7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.