0

我有很多控制器,它们扩展了一个基本控制器,它有一个带有 ResourceBundle 生成的静态构造器:

static {
   resources = ResourceBundle.getBundle("com.resource.Resources");
}

我需要它,因为应用程序的逻辑基于语言环境,而不仅仅是视图。

此外,我还有一个CookieLocaleResolver从 cookie 中解析当前语言环境的方法。

问题是基本控制器的静态构造函数代码在 CookieLocaleResolver 的 resolveLocale 方法之前执行,所以我总是在 ResourceBundle 收到系统的默认语言环境,而不是当前语言环境。

我该如何解决?谢谢

4

1 回答 1

1

那是因为该static块是在类初始化时执行的。您需要在ResourceBundle调用控制器时加载。我建议您在这里将您的控制器定义为 aprototype并用于InitializingBean加载 ResourceBundle。

public class MyController implements InitializingBean {
    private ResourceBundle resources;

    public void afterPropertiesSet() {
         resources = ResourceBundle.getBundle("com.resource.Resources");
    }
}

更好的方法是使用ResourceBundleMessageSource而不是直接使用 ResourceBundle。如果可以,那会容易得多,因为您不必直接管理 ResourceBundle。

我希望这会对你有所帮助。

[编辑]

Spring MessageSource 提供了使用参数解析消息的方法。如果您MessageSource在应用程序中定义 a,您还可以在视图(例如 JSP 页面)中访问相同的消息。最后,从设计来看,如果控制器没有对资源包的直接引用,这样会更好,这样您的标签/消息就可以在一个地方进行管理(在声明 MessageSource 时在 Spring 配置中)。

于 2013-06-27T18:19:17.127 回答