MessageSource不会重新加载属性文件

时间:2017-11-05 20:54:56

标签: java spring spring-boot properties

有一个messageSource Bean:

// Get a db connection.
$db = JFactory::getDbo();

// Create a new query object.
$query = $db->getQuery(true);
$query
    ->select($db->quoteName(array('user_id', 'profile_key', 'profile_value', 'ordering')))
    ->from($db->quoteName('#__user_profiles'))
    ->setLimit('10');

我已经读过某个地方,如果我使用@Bean public MessageSource messageSource(){ ReloadableResourceBundleMessageSource messageSource=new ReloadableResourceBundleMessageSource(); messageSource.setDefaultEncoding("UTF-8"); messageSource.setBasenames("classpath:/messages/messages"); return messageSource; } ,则不应缓存messageSource,并且每次查看属性文件(如果该字符串是特定字符串)。可悲的是,用这种方式创建的bean它不起作用。编译后如果我添加一些属性Spring Boot将无法找到它。 属性文件位于ReloadableResourceBundleMessageSource和/ resources /resources/messages/messages.properties中。

1 个答案:

答案 0 :(得分:0)

尝试此解决方案。 首先:如下所示在您的Web配置中配置Bean。

@Bean
public MessageSource messageSource () {
    ReloadableResourceBundleMessageSourceExt messageResource =
            new ReloadableResourceBundleMessageSourceExt();
    messageResource.setAlwaysUseMessageFormat(false);
    messageResource.setBasenames("classpath:messages");
    messageResource.setDefaultEncoding(CHARACTER_ENCODING);
    messageResource.setFallbackToSystemLocale(true);
    messageResource.setUseCodeAsDefaultMessage(false);
    messageResource.setCacheSeconds(1); // by default it set to -1 which means cache 
                                        // forever messageSourse.
                                        // set 0 to check reload messeageSource on 
                                        // every getMessageSource request but reload 
                                        // only those files which last modified 
                                        // timestamp is changed.
                                        // value greater than 1 is treated as the 
                                        // time interval between reload.
    return messageResource;
}

第二个:创建一个扩展ReloadableResourceBundleMessageSource的类,以暴露其内部类的受保护方法,如下所示。

public class ReloadableResourceBundleMessageSourceExt extends ReloadableResourceBundleMessageSource {

public Properties getPropertiesByFileName(String fileName){
    return super.getProperties(fileName).getProperties();
}

}

第三:现在像这样自动连接bean。

@Service 
public class MyMessagesBundleService {

final private String fileName = "classpath:messages";

@Autowired
ReloadableResourceBundleMessageSourceExt messageSource;
Properties properties = messageSource.getPropertiesByFileName(this.fileName);
// now change the properties and saved it.
// after saved call clear cache and get again.
messageSource.clearCache();

}