2013-06-27 117 views
0

我有很多是扩展其与资源包生成静态构造器一个基本控制器控制器的:因为应用程序的逻辑基础上的语言环境,不仅景色Spring MVC的:静态资源包

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

我需要它。

此外,我有一个CookieLocaleResolver解决从cookie的当前区域设置。

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

我该如何解决?谢谢

回答

1

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

public class MyController implements InitializingBean { 
    private ResourceBundle resources; 

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

一个更好的办法是使用ResourceBundleMessageSource,而不是直接使用资源包。如果可以的话,那将会更容易,因为您不必直接管理ResourceBundle。

我希望能帮到你。

[编辑]

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

+0

感谢您的回复,这是非常有用的。你能解释为什么使用'ResourceBundleMessageSource'更好吗?据我了解它的缓存ResourceBundle的速度更快,但我找不到任何示例显示它更有用... – nKognito

+0

如果我添加'InitializingBean'继承应用程序失败,并且名称为spring.liveBeansView.mbeanDomain未绑定在这种情况下。返回null'错误... – nKognito

+0

我在一个新问题中描述了我的问题:http://stackoverflow.com/questions/17443854/spring-mvc-static-resourcebundle-vs-messagesource – nKognito