如何将一系列application.properties反序列化为Java中的Map

我有一个Spring Boot Application,看起来像application.properties

com.mycompany.schedule.test=welcome
com.mycompany.schedule.test2=hi there

我希望将它们反序列化为Map

我尝试了以下方法和其他变体,但是它似乎不起作用

  private Map<String,String> schedules;

  @Value("${com.mycompany.schedule}")
  public void setSchedules(Map<String,String> values) {
    this.schedules = values;
  }
fjxxq147 回答:如何将一系列application.properties反序列化为Java中的Map

选项1:

在您的配置类中,使用@PropertySource批注读取application.properties文件,如下所示。

MyAppConfiguration.java

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource(name = "customPropertySource",value = "classpath:application.properties")
public class MyAppConfiguration {

}

然后在您的POJO(或任何其他spring组件)中,可以使用Environment类来获取属性。

MyPojo.java

import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.io.support.ResourcePropertySource;
import org.springframework.stereotype.Component;

@Component
public class MyPojo {

    @Autowired
    private ConfigurableEnvironment env;

    private Map<String,Object> schedules;

    @PostConstruct
    public void properties() {
        Object propSourceObj = env.getPropertySources().get("customPropertySource");
        if (propSourceObj instanceof ResourcePropertySource) {
            ResourcePropertySource propSource = (ResourcePropertySource) propSourceObj;
            setSchedules(propSource.getSource());
        }
        System.out.println("Schedules: " + getSchedules());

    }

    public Map<String,Object> getSchedules() {
        return schedules;
    }

    public void setSchedules(Map<String,Object> schedules) {
        this.schedules = schedules;
    }

}

请注意,使用此选项,您将读取application.properties文件两次。如果可以,则可以选择选项1。否则,可以选择选项2。

选项2:

MyAppConfiguration.java

import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAppConfiguration {

}

MyPojo.java

import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.env.OriginTrackedMapPropertySource;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.stereotype.Component;

@Component
public class MyPojo {

    @Autowired
    private ConfigurableEnvironment env;

    private Map<String,Object> schedules;

    @PostConstruct
    public void properties() {
        Object propSourceObj = env.getPropertySources().get("applicationConfig: [classpath:/application.properties]");
        if (propSourceObj instanceof OriginTrackedMapPropertySource) {
            OriginTrackedMapPropertySource propSource = (OriginTrackedMapPropertySource) propSourceObj;
            setSchedules(propSource.getSource());
        }
        System.out.println("Schedules: " + getSchedules());

    }

    public Map<String,Object> schedules) {
        this.schedules = schedules;
    }

}

编辑:

对不起,我先前误解了您的问题。如果知道属性前缀,则可以使用@ConfigurationProperties,如下所示。以上选项是在不知道属性前缀的情况下读取所有属性的。

MyAppConfiguration.java

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyAppConfiguration {

    @Autowired
    private MyCompanyConfigurationProperties myCompanyConfProps;

    @PostConstruct
    public void testProperteis() {
        System.out.println("My Properties: " + myCompanyConfProps.getSchedule());
    }

}

MyCompanyConfigurationProperties.java

import java.util.HashMap;
import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "com.mycompany")
public class MyCompanyConfigurationProperties {

    private Map<String,String> schedule = new HashMap<String,String>();

    public Map<String,String> getSchedule() {
        return schedule;
    }

    public void setSchedule(Map<String,String> schedule) {
        this.schedule = schedule;
    }

}
本文链接:https://www.f2er.com/3152313.html

大家都在问