【问题标题】:MessageSource doesn't reload properties fileMessageSource 不会重新加载属性文件
【发布时间】:2018-04-18 00:02:47
【问题描述】:

有一个messageSource Bean:

@Bean
public MessageSource messageSource(){
    ReloadableResourceBundleMessageSource messageSource=new ReloadableResourceBundleMessageSource();
    messageSource.setDefaultEncoding("UTF-8");
    messageSource.setBasenames("classpath:/messages/messages");
    return messageSource;
}

我在某处读到如果我使用ReloadableResourceBundleMessageSource messageSource 不应该被缓存并且每次查看属性文件是否有特定的字符串。可悲的是,以这种方式创建的 bean 它不起作用。编译后如果我添加一些属性 Spring Boot 将找不到它。 属性文件位于 /resources/messages/messages.properties 和 /resources/messages/messages_en.properties 中。

【问题讨论】:

  • 尝试将cacheSecondsusing setCacheSeconds设置为0?
  • javadocs 中提到的另一件事:“使用“classpath:”前缀,仍然可以从类路径加载资源,但“-1”以外的“cacheSeconds”值(永久缓存)可能在这种情况下不能可靠地工作。”因此,如果cacheSeconds 不起作用,请尝试将消息文件放在类路径之外并使用setBaseNames 中的绝对路径
  • @MohamedSanaulla 添加setCacheMillis(0) 没有帮助。关于路径,如果我的消息在资源文件夹中,这还不够吗?因为它在资源文件夹中,所以我应该放“/messages/messages.properties”,不是吗?你知道如何让它在 intelij 中工作(也许是它的 intelij 错误)?
  • 你应该能够给出一个绝对路径,比如 /opt/resources/message 试试看。
  • @MohamedSanaulla 很遗憾,以下这些都不起作用:app/src/main/resources/messages/messages/src/main/resources/messages/messagesmain/resources/messages/messagesresources/messages/messagesmessages/messages

标签: java spring spring-boot properties


【解决方案1】:

试试这个解决方案。 首先:在你的 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的类,暴露其内部类的protected方法,如下所示。

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();

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2012-05-07
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多