有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java MessageSource不重新加载属性文件

有一个MessageSourcebean:

@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


共 (1) 个答案

  1. # 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的类,以公开其内部类的受保护方法,如下所示

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