我正在使用Spring來顯示屬性文件中的消息。我希望能夠覆蓋<spring:message>
標記以使用基於登錄用戶的數據庫中的值。如果此值不存在,我希望它現在默認爲屬性文件中當前的值。覆蓋彈簧:帶有數據庫值的消息標記
有人可以幫我用這段代碼嗎?我已閱讀關於AbstractMessageSource的內容,但我不清楚如何實現它。
謝謝
我正在使用Spring來顯示屬性文件中的消息。我希望能夠覆蓋<spring:message>
標記以使用基於登錄用戶的數據庫中的值。如果此值不存在,我希望它現在默認爲屬性文件中當前的值。覆蓋彈簧:帶有數據庫值的消息標記
有人可以幫我用這段代碼嗎?我已閱讀關於AbstractMessageSource的內容,但我不清楚如何實現它。
謝謝
您必須實現自定義消息源。這是一個擴展AbstractMessageSource
並實現抽象方法resolveCode(java.lang.String, java.util.Locale)
的類。這裏幾乎same question對SO(Grails的它的解決方案),但我認爲這是很好的點,從開始...
看看這些線程在春季論壇:
您不需要更改<spring:message>
的行爲,只需更改它從其獲取其消息的位置即可。
默認情況下,它在上下文中使用messageSource
bean,該類型的類型爲MessageSource
或其某個子類。您可以編寫自己的類來實現MessageSource
,並將其作爲messageSource
bean添加到您的上下文中。
AbstractMessageSource
只是寫出自己的MessageSource
的方便起點。它爲你做了一些工作,只是繼承它。
我最終創建了一個名爲DatabaseMessageSource的類,如下所示。我仍然需要實施某種緩存,因此每次調用時都不會觸及數據庫。這link也有幫助。謝謝skaffman和PrimosK爲我指出正確的方向。
public class DatabaseMessageSource extends ReloadableResourceBundleMessageSource {
@Autowired
private MyDao myDao;
protected MessageFormat resolveCode(String code, Locale locale) {
MyObj myObj = myDao.findByCode(code);
MessageFormat format;
if (myObj!= null && myObj.getId() != null) {
format = new MessageFormat(myObj.getValue(), locale);
} else {
format = super.resolveCode(code, locale);
}
return format;
}
protected String resolveCodeWithoutArguments(String code, Locale locale) {
MyObj myObj = myDao.findByCode(code);
String format;
if (myObj != null && myObj.getId() != null) {
format = myObj.getValue();
} else {
format = super.resolveCodeWithoutArguments(code, locale);
}
return format;
}
}
我更新了我的applicationContext指向新創建的類。 我把它改爲:
<bean id="messageSource" class="com.mycompany.mypackage.DatabaseMessageSource">
<property name="basenames">
<list>
<value>classpath:defaultMessages</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>`enter code here`
緩存我建議的Ehcache ...看看[這](http://ehcache.org/documentation/recipes/thunderingherd)和[這裏](HTTP: //ehcache.org/documentation/recipes/spring-annotations).... – PrimosK
謝謝你。我將執行第一個鏈接。你真的很有幫助。再次感謝 – blong824
一個跟進問題。我如何將控制器中的對象傳遞給我的DatabaseMessageSource類?當彈出消息標籤的屏幕被加載時,該對象在會話中。 – blong824