2012-05-16 4 views
7

Sto usando Spring per visualizzare messaggi da un file di proprietà. Mi piacerebbe essere in grado di ignorare il tag per utilizzare un valore da un database basato sull'utente che ha effettuato l'accesso. Se questo valore non è presente, mi piacerebbe che fosse impostato per default sul valore attualmente nel file delle proprietà come ora.Override Spring: tag di messaggio con valori di database

Qualcuno può aiutarmi con questo codice? Ho letto su AbstractMessageSource ma non sono chiaro su come implementarlo.

Grazie

risposta

7

È necessario implementare l'origine messaggio personalizzato. È una classe che estende AbstractMessageSource e implementa il metodo astratto resolveCode(java.lang.String, java.util.Locale). Non v'è quasi same question su SO (è la soluzione per Grails), ma credo che sia buon punto di partenza da ...

Date un'occhiata a quei fili nei forum di primavera:

1

Non è necessario modificare il comportamento di <spring:message>, è sufficiente modificare la posizione da cui riceve i messaggi.

Per impostazione predefinita, utilizza il bean messageSource nel contesto, che è di tipo MessageSource o una sua sottoclasse. Puoi scrivere la tua classe che implementa MessageSource e aggiungerla al tuo contesto come bean messageSource.

AbstractMessageSource è solo un comodo punto di partenza per scrivere il proprio MessageSource. Fa parte del lavoro per te, basta sottoclassi.

2

Ho finito per creare una classe denominata DatabaseMessageSource inclusa di seguito. Devo ancora implementare un qualche tipo di memorizzazione nella cache in modo da non colpire il database con ogni chiamata. Anche questo link era utile. Grazie skaffman e PrimosK per avermi indicato nella giusta direzione.

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; 

    } 

} 

Ho aggiornato il mio applicationContext per puntare alla classe appena creata. ho cambiato in:

<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

Per il caching vorrei suggerire EHCache ... Date un'occhiata a [questo] (http://ehcache.org/documentation/recipes/thunderingherd) e [questo] (http: //ehcache.org/documentation/recipes/spring-annotations) .... – PrimosK

+0

Grazie per questo. Implementerò il primo collegamento. Sei stato davvero d'aiuto. Grazie ancora – blong824

+0

Una domanda di follow-up. Come posso passare un oggetto dal controller alla mia classe DatabaseMessageSource? L'oggetto è in sessione al momento dello schermo con la molla: i tag dei messaggi vengono caricati. – blong824