2012-05-16 88 views
7

我正在使用Spring來顯示屬性文件中的消息。我希望能夠覆蓋<spring:message>標記以使用基於登錄用戶的數據庫中的值。如果此值不存在,我希望它現在默認爲屬性文件中當前的值。覆蓋彈簧:帶有數據庫值的消息標記

有人可以幫我用這段代碼嗎?我已閱讀關於AbstractMessageSource的內容,但我不清楚如何實現它。

謝謝

回答

7

您必須實現自定義消息源。這是一個擴展AbstractMessageSource並實現抽象方法resolveCode(java.lang.String, java.util.Locale)的類。這裏幾乎same question對SO(Grails的它的解決方案),但我認爲這是很好的點,從開始...

看看這些線程在春季論壇:

1

您不需要更改<spring:message>的行爲,只需更改它從其獲取其消息的位置即可。

默認情況下,它在上下文中使用messageSource bean,該類型的類型爲MessageSource或其某個子類。您可以編寫自己的類來實現MessageSource,並將其作爲messageSource bean添加到您的上下文中。

AbstractMessageSource只是寫出自己的MessageSource的方便起點。它爲你做了一些工作,只是繼承它。

2

我最終創建了一個名爲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` 
+0

緩存我建議的Ehcache ...看看[這](http://ehcache.org/documentation/recipes/thunderingherd)和[這裏](HTTP: //ehcache.org/documentation/recipes/spring-annotations).... – PrimosK

+0

謝謝你。我將執行第一個鏈接。你真的很有幫助。再次感謝 – blong824

+0

一個跟進問題。我如何將控制器中的對象傳遞給我的DatabaseMessageSource類?當彈出消息標籤的屏幕被加載時,該對象在會話中。 – blong824