Override Spring:message tag with database values

后端 未结 3 1974
小蘑菇
小蘑菇 2020-12-09 12:38

I am using Spring to display messages from a properties file. I would like to be able to override the tag to use a value from a database

相关标签:
3条回答
  • 2020-12-09 13:10

    You have to implement custom message source. It's a class that extends AbstractMessageSource and implements the abstract resolveCode(java.lang.String, java.util.Locale) method. There is almost same question on SO (it's solution for Grails), but I think it is good point to start from...

    0 讨论(0)
  • 2020-12-09 13:12

    You don't need to change the behaviour of <spring:message>, you just need to change the place it gets its messages from.

    By default, it uses the messageSource bean in the context, which is of type MessageSource, or some subclass thereof. You can write your own class that implements MessageSource and add that to your context as the messageSource bean.

    AbstractMessageSource is just a convenient starting point for writing your own MessageSource. It does some of the work for you, just subclass it.

    0 讨论(0)
  • 2020-12-09 13:18

    I ended up creating a class called DatabaseMessageSource included below. I still need to implement some kind of caching so I don't hit the database with each call. This link was helpful too. Thank you skaffman and PrimosK for pointing me in the right direction.

    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;
    
        }
    
    }
    

    I updated my applicationContext to point to the newly created class. I changed it to:

    <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 讨论(0)
提交回复
热议问题