Получите int, float, boolean и строку из Properties
У меня есть int, float, boolean и строка из файла свойств. Все загружено в свойствах. В настоящее время я анализирую значения, поскольку я знаю ожидаемое значение для конкретного ключа.
Boolean.parseBoolean("false");
Integer.parseInt("3")
Какой лучший способ установить эти значения констант, если я не знаю, что может быть примитивным значением типа данных для ключа.
public class Messages {
Properties appProperties = null;
FileInputStream file = null;
public void initialization() throws Exception {
appProperties = new Properties();
try {
loadPropertiesFile();
} catch (Exception e) {
throw new Exception(e.getMessage(), e);
}
}
public void loadPropertiesFile() throws IOException {
String path = "./cfg/message.properties";
file = new FileInputStream(path);
appProperties.load(file);
file.close();
}
}
Файл свойств.
messassge.properties
SSO_URL = https://example.com/connect/token
SSO_API_USERNAME = test
SSO_API_PASSWORD = Uo88YmMpKUp
SSO_API_SCOPE = intraday_api
SSO_IS_PROXY_ENABLED = false
SSO_MAX_RETRY_COUNT = 3
SSO_FLOAT_VALUE = 3.0
Constant.java
public class Constants {
public static String SSO_URL = null;
public static String SSO_API_USERNAME = null;
public static String SSO_API_PASSWORD = null;
public static String SSO_API_SCOPE = null;
public static boolean SSO_IS_PROXY_ENABLED = false;
public static int SSO_MAX_RETRY_COUNT = 0;
public static float SSO_FLOAT_VALUE = 0;
}
Ответы
Ответ 1
Если у вас есть класс значений конфигурации, например ваш класс Constants
, и вы хотите загрузить все значения из файла конфигурации (свойств), вы можете создать небольшой вспомогательный класс и использовать отражение:
public class ConfigLoader {
public static void load(Class<?> configClass, String file) {
try {
Properties props = new Properties();
try (FileInputStream propStream = new FileInputStream(file)) {
props.load(propStream);
}
for (Field field : configClass.getDeclaredFields())
if (Modifier.isStatic(field.getModifiers()))
field.set(null, getValue(props, field.getName(), field.getType()));
} catch (Exception e) {
throw new RuntimeException("Error loading configuration: " + e, e);
}
}
private static Object getValue(Properties props, String name, Class<?> type) {
String value = props.getProperty(name);
if (value == null)
throw new IllegalArgumentException("Missing configuration value: " + name);
if (type == String.class)
return value;
if (type == boolean.class)
return Boolean.parseBoolean(value);
if (type == int.class)
return Integer.parseInt(value);
if (type == float.class)
return Float.parseFloat(value);
throw new IllegalArgumentException("Unknown configuration value type: " + type.getName());
}
}
Затем вы вызываете его так:
ConfigLoader.load(Constants.class, "/path/to/constants.properties");
Вы можете расширить код для обработки большего количества типов. Вы также можете изменить его, чтобы игнорировать отсутствующие свойства, вместо того, чтобы терпеть неудачу, как сейчас, так что назначения в объявлении поля остаются неизменными, т.е. Будут по умолчанию.
Ответ 2
Если вы знаете тип константы, вы можете использовать Коллекции Apache Commons.
Например, вы можете использовать некоторый метод утилит, основанный на типе вашей константы.
booelan SSO_IS_PROXY_ENABLED = MapUtils.getBooleanValue(appProperties, "SSO_IS_PROXY_ENABLED", false);
String SSO_URL = MapUtils.getString(appProperties, "SSO_URL", "https://example.com/connect/token");
Вы можете даже использовать значения по умолчанию, чтобы избежать ошибок.
Ответ 3
Dambros прав, все, что вы храните в файле свойств, является значением String.
Вы можете отслеживать свои разные примитивные типы данных после получения значения свойств, как показано ниже, например, ref. -
Файл свойств Java: как читать значения config.properties в Java?
package crunchify.com.tutorial;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;
/**
* @author Crunchify.com
*
*/
public class CrunchifyGetPropertyValues {
String result = "";
InputStream inputStream;
public String getPropValues() throws IOException {
try {
Properties prop = new Properties();
String propFileName = "config.properties";
inputStream = getClass().getClassLoader().getResourceAsStream(propFileName);
if (inputStream != null) {
prop.load(inputStream);
} else {
throw new FileNotFoundException("property file '" + propFileName + "' not found in the classpath");
}
Date time = new Date(System.currentTimeMillis());
// get the property value and print it out
String user = prop.getProperty("user");
String company1 = prop.getProperty("company1");
String company2 = prop.getProperty("company2");
String company3 = prop.getProperty("company3");
result = "Company List = " + company1 + ", " + company2 + ", " + company3;
System.out.println(result + "\nProgram Ran on " + time + " by user=" + user);
} catch (Exception e) {
System.out.println("Exception: " + e);
} finally {
inputStream.close();
}
return result;
}
}
а затем преобразовать в примитив -
Как преобразовать значение String в значение примитивного типа?
Я предлагаю вам отслеживать значение ваших типов данных, помещая значения ключа в оператор switch типа String, а затем извлекает связанное значение типа данных, используя ключевые имена.
Случай с строковым типом возможен после Java 7.
Ответ 4
Не совсем уверен, насколько я точно понимаю проблему, но возможность может включать в себя тип значения свойства в (String). Так, например, свойства, которые вы показали, станут чем-то вроде:
SSO_URL = URL:https://example.com/connect/token
SSO_API_USERNAME = STRING:test
SSO_API_PASSWORD = STRING:Uo88YmMpKUp
SSO_API_SCOPE = STRING:intraday_api
SSO_IS_PROXY_ENABLED = BOOLEAN:false
SSO_MAX_RETRY_COUNT = INTEGER:3
SSO_FLOAT_VALUE = FLOAT:3.0
Во время разбора значений свойств вы сначала определяете тип свойства, просматривая часть до :
и используя деталь после фактического разбора.
private static Object getValue(Properties props, String name) {
String propertyValue = props.getProperty(name);
if (propertyValue == null) {
throw new IllegalArgumentException("Missing configuration value: " + name);
} else {
String[] parts = string.split(":");
switch(parts[0]) {
case "STRING":
return parts[1];
case "BOOLEAN":
return Boolean.parseBoolean(parts[1]);
....
default:
throw new IllegalArgumentException("Unknown configuration value type: " + parts[0]);
}
}
}
Ответ 5
Следуйте шаблону конфигурации dropwizard, в котором вы определяете свои константы, используя YAML вместо свойств, и используйте Jackson для десериализации его в свой класс. Помимо безопасности типов, шаблон конфигурации dropwizard идет еще на один шаг, позволяя аннотации Hibernate Validator проверять, чтобы значения попадали в ваши ожидаемые диапазоны.
Для примера dropwizard...
Подробнее об этой технологии...
- github.com/FasterXML/jackson-dataformat-yaml
- hibernate.org/validator/
Ответ 6
Spring Загрузив готовый к использованию и предложив решение для свойства конфигурации типа,
Определенно, использование Spring только для этой задачи является излишним, но Spring имеет много интересных функций, и это может привлечь вас к правой стороне;)