2012-05-16 21 views
7

Estoy usando Spring para mostrar los mensajes de un archivo de propiedades. Me gustaría poder anular la etiqueta <spring:message> para usar un valor de una base de datos basada en el usuario que ha iniciado sesión. Si este valor no está presente, me gustaría que establezca el valor actualmente en el archivo de propiedades como lo hace ahora.Override Spring: etiqueta de mensaje con valores de base de datos

¿Alguien me puede ayudar con este código? He leído sobre AbstractMessageSource pero no tengo claro cómo implementarlo.

Gracias

Respuesta

7

Se tienen que implementar fuente del mensaje personalizado. Es una clase que se extiende AbstractMessageSource e implementa el método abstracto resolveCode(java.lang.String, java.util.Locale). No hay casi same question el SO (que es la solución para Grails), pero creo que es un buen punto para empezar a ...

Tome un vistazo a esos hilos en foros de primavera:

1

No necesita cambiar el comportamiento de <spring:message>, solo necesita cambiar el lugar de donde recibe sus mensajes.

De forma predeterminada, usa el bean messageSource en el contexto, que es del tipo MessageSource, o alguna subclase del mismo. Puede escribir su propia clase que implemente MessageSource y agregar eso a su contexto como el bean messageSource.

AbstractMessageSource es solo un punto de partida conveniente para escribir su propio MessageSource. Hace parte del trabajo por ti, solo subclases.

2

Terminé creando una clase llamada DatabaseMessageSource incluida a continuación. Todavía tengo que implementar algún tipo de almacenamiento en caché, así que no golpeo la base de datos con cada llamada. Este link también fue útil. Gracias skaffman y PrimosK por apuntarme en la dirección correcta.

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; 

    } 

} 

Actualicé mi applicationContext para apuntar a la clase recién creada. lo cambié a:

<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

Para el almacenamiento en caché que sugeriría Ehcache ... Tome un vistazo a [esta] (http://ehcache.org/documentation/recipes/thunderingherd) y [esto] (http: //ehcache.org/documentation/recipes/spring-annotations) .... – PrimosK

+0

Gracias por esto. Implementaré el primer enlace. Has sido realmente útil. Gracias de nuevo – blong824

+0

Una pregunta de seguimiento. ¿Cómo puedo pasar un objeto del controlador a mi clase DatabaseMessageSource? El objeto está en sesión cuando se carga la pantalla con el resorte: etiquetas de mensaje. – blong824

Cuestiones relacionadas