Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Override Spring:message tag with database values

I am using Spring to display messages from a properties file. I would like to be able to override the <spring:message> tag to use a value from a database based on the logged in user. If this value is not present I would like it to default to the value currently in the properties file as it does now.

Can someone help me with this code? I've read about AbstractMessageSource but I am unclear on how to implement it.

Thanks

like image 490
blong824 Avatar asked May 16 '12 17:05

blong824


2 Answers

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...

like image 125
PrimosK Avatar answered Sep 18 '22 20:09

PrimosK


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`
like image 42
blong824 Avatar answered Sep 19 '22 20:09

blong824