2013-06-27 118 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