In an application (not a plugin), something along these lines should work...
The new message source:
// src/groovy/com/demo/MyMessageSource.groovy
package com.demo
import org.springframework.context.MessageSource
import org.springframework.context.MessageSourceResolvable
import org.springframework.context.NoSuchMessageException
class MyMessageSource implements MessageSource {
MessageSource theRealMessageSource
String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
theRealMessageSource.getMessage code, args, defaultMessage, locale
}
String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
theRealMessageSource.getMessage code, args, locale
}
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
theRealMessageSource.getMessage resolvable, locale
}
}
A post processor:
// src/groovy/com/demo/MyPostProcessor.groovy
package com.demo
import org.springframework.beans.factory.config.BeanFactoryPostProcessor
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.beans.BeansException
class MyPostProcessor implements BeanFactoryPostProcessor {
@Override
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// error handling ommitted for brevity here...
def realMessageSource = beanFactory.getBean('messageSource')
def newMessageSource = new MyMessageSource()
newMessageSource.theRealMessageSource = realMessageSource
beanFactory.removeBeanDefinition 'messageSource'
beanFactory.registerSingleton 'messageSource', newMessageSource
}
}
Register the post processor:
// grails-app/conf/spring/resources.groovy
beans = {
myMessageSourcePostProcessor com.demo.MyPostProcessor
}