Necesito leer todas las propiedades en el archivo application.properties en un mapa. En el siguiente código, la prueba de propiedades tiene el valor respectivo pero el mapa está vacío. ¿Cómo puedo llenar "map" con los valores en el archivo application.properties sin agregar un prefijo a las propiedades?

Este es mi archivo application.properties

AAPL=25
GDDY=65
test=22

Estoy usando @ConfigurationProperties como este

@Configuration
@ConfigurationProperties("")
@PropertySource("classpath:application.properties")
public class InitialConfiguration {
    private HashMap<String, BigInteger> map = new HashMap<>();
    private String test;

    public HashMap<String, BigInteger> getMap() {
        return map;
    }

    public void setMap(HashMap<String, BigInteger> map) {
        this.map = map;
    }

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }
}
2
Jorge Miralles 10 sep. 2018 a las 07:54

4 respuestas

La mejor respuesta

Esto se puede lograr utilizando PropertiesLoaderUtils y @PostConstruct

Por favor, consulte la muestra a continuación:

@Configuration
public class HelloConfiguration {
    private Map<String, String> valueMap = new HashMap<>();
    @PostConstruct
    public void doInit() throws IOException {
        Properties properties = PropertiesLoaderUtils.loadAllProperties("application.properties");
        properties.keySet().forEach(key -> {
            valueMap.put((String) key, properties.getProperty((String) key));
        });
        System.err.println("valueMap -> "+valueMap);
    }
    public Map<String, String> getValueMap() {
        return valueMap;
    }
    public void setValueMap(Map<String, String> valueMap) {
        this.valueMap = valueMap;
    }
}
2
Saikat 10 sep. 2018 a las 08:20

En el arranque de primavera, si necesita obtener un solo valor de application.properties, solo necesita usar la anotación @Value con el nombre dado

Entonces, para obtener el valor AAPL, simplemente agregue una propiedad de nivel de clase como esta

@Value("${AAPL}")
private String aapl;

Y si necesita cargar un archivo de propiedades completo como un mapa, estoy usando ResourceLoader para cargar el archivo completo como una secuencia y luego analizarlo de la siguiente manera

@Autowired
public loadResources(ResourceLoader resourceLoader) throws Exception {      
      Resource resource = resourceLoader.getResource("classpath:myProperties.properties"));
      BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()));
      String line;
      int pos = 0;
      Map<String, String> map = new HashMap<>();
      while ((line = br.readLine()) != null) {
           pos = line.indexOf("=");
           map.put(line.substring(0, pos), line.substring( pos + 1));
      }
}
1
Hany Sakr 10 sep. 2018 a las 05:49
@PropertySource("classpath:config.properties")
public class GlobalConfig {

  public static String AAPL;
  @Value("${AAPL}")
  private void setDatabaseUrl(String value) {
    AAPL = value;
  }
}

Debe usar @Value para obtener valor del archivo application.properties

0
Eklavya 10 sep. 2018 a las 05:55

No puedo hacerlo con @ConfigurationProperties, que yo sepa, esos requieren un prefijo para poder cargar esas propiedades dentro del bean.

Sin embargo, si su objetivo es obtener el "valor Y" para la "propiedad X" mediante programación, siempre puede inyectar Environment y use el método getProperty() para encontrar ciertas propiedades, por ejemplo:

@Configuration
public class InitialConfiguration {
    @Autowired
    private Environment environment;

    @PostConstruct
    public void test() {
        Integer aapl = environment.getProperty("AAPL", Integer.class); // 25
        Integer gddy = environment.getProperty("GDDY", Integer.class); // 65
        Integer test = environment.getProperty("test", Integer.class); // 22
    }
}
0
g00glen00b 10 sep. 2018 a las 06:18