我有一个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;
}
答案 0 :(得分:0)
选项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> getSchedules() {
return schedules;
}
public void setSchedules(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;
}
}