Spring:以编程方式将属性文件加载到对象

bvjxkvbb  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(146)

在一个多租户Sping Boot 应用程序中,我正在尝试加载配置对象。理想情况下,我希望通过编程方式将某些属性文件加载到配置对象中。我正在寻找一种简单的方法,通过传递一个属性文件和最终的类来加载配置。以下只是我尝试实现的一个示例。

配置的目录结构:

config/
     - common.properties
     all_tenants_config/
         - foo_tenant/
            - database.properties
            - api.properties
         - bar_tenant/
            - database.properties
            - api.properties

配置POJO:

class DatabaseProperties {
   @Value("${database.url}")
   private String url;
}

class APIProperties {
   @Value("${api.endPoint}")
   private String endPoint;
}

配置提供程序:

@Singleton
 class ConfigurationProvider {

   private Map<String, DatabaseProperties> DB_PROPERTIES = new HashMap<>();
   private Map<String, APIProperties> API_PROPERTIES = new HashMap<>();

   public ConfigurationProvider(@Value(${"tenantsConfigPath"}) String tenantsConfigPath) {
        for (File tenant : Path.of(tenantsConfigPath).toFile().listFiles()) {
            String tenantName = tenant.getName();
            for (File configFile : tenant.listFiles()) {
                String configName = configFile.getName();
                if ("database.properties".equals(configName)) {

                    // This is what I'm looking for. An easy way to load the configuration by passing a properties file and the final class to map it to.

                    DB_PROPERTIES.put(tenant, SPRING_CONFIG_LOADER.load(configFile, DatabaseProperties.class));

                } else if ("api.properties".equals(configName)) {
                    API_PROPERTIES.put(tenant, SPRING_CONFIG_LOADER.load(configFile, API.class));
                }
            }
        }
   }

   public currentTenantDBProperties() {
       return DB_PROPERTIES.get(CURRENT_TENANT_ID);
   }

   public currentTenantAPIProperties() {
       return API_PROPERTIES.get(CURRENT_TENANT_ID);
   }

}

简而言之,Spring中是否有一种方法允许将属性文件Map到对象,而不使用默认的Spring配置注解?

0kjbasz6

0kjbasz61#

在这种情况下,您不需要任何Spring的特性。
Spring是一个bean容器,但是在这个地方你只需要自己新建一个对象,然后把它放在你的Map缓存上。
步骤1:将属性文件解码为Java属性类对象
第二步:将属性对象转换为目标对象,只需使用一些实用工具,如objectmapper

FileReader reader = new FileReader("db.properties"); // replace file name with your variable
    Properties p = new Properties();
    p.load(reader);
    ObjectMapper mapper = new ObjectMapper();
    DatabaseProperties databaseProperties = mapper.convertValue(p, 
    DatabaseProperties.class);

相关问题