欠落しているプロパティを無視しようとすると、欠落しているプロパティが必須であるかオプションであるかがわからないため、注意が必要です。だから私はそれを行うためのプログラム的な方法を好みます。
まず、プロパティファイルにアクセスするための基本クラスを用意します。
public abstract class ClasspathProperties {
private final Environment environment;
public ClasspathProperties(final Environment environment, final String propertiesLocation) {
try {
final PropertySource<?> propertySource = new ResourcePropertySource(propertiesLocation);
verifyProperties(propertySource);
((ConfigurableEnvironment) environment).getPropertySources().addFirst(propertySource);
this.environment = environment;
} catch (final IOException e) {
throw new IllegalStateException("reading properties from location " + propertiesLocation + " failed", e);
}
}
public Environment getEnvironment() {
return environment;
}
protected abstract void verifyProperties(PropertySource<?> propertySource);
protected void verifyPropertyExistence(final PropertySource<?> propertySource, final String propertyName,
final String propertyDescription) {
final Object propertyValue = propertySource.getProperty(propertyName);
if (propertyValue == null || "".equals(propertyValue)) {
throw new IllegalStateException(propertyDescription + " is not set");
}
}
}
次に、指定されたプロパティファイルを読み取り、プロパティを設定する前に検証することができます。
public class ClasspathDatabaseProperties extends ClasspathProperties implements DatabaseProperties {
public ClasspathDatabaseProperties(final Environment environment) {
this(environment, "classpath:/config/db-config.properties");
}
public ClasspathDatabaseProperties(final Environment environment, final String propertiesLocation) {
super(environment, propertiesLocation);
}
@Override
protected void verifyProperties(final PropertySource<?> propertySource) {
verifyPropertyExistence(propertySource, "mysql.host", "MySQL DB host");
verifyPropertyExistence(propertySource, "mysql.port", "MySQL DB port");
verifyPropertyExistence(propertySource, "mysql.database", "MySQL DB DB name");
verifyPropertyExistence(propertySource, "mysql.username", "MySQL DB username");
verifyPropertyExistence(propertySource, "mysql.password", "MySQL DB password");
}
@Override
public String getHost() {
return getEnvironment().getProperty("mysql.host");
}
@Override
public int getPortNumber() {
return getEnvironment().getProperty("mysql.port", Integer.class);
}
@Override
public String getDatabase() {
return getEnvironment().getProperty("mysql.database");
}
@Override
public String getUsername() {
return getEnvironment().getProperty("mysql.username");
}
@Override
public String getPassword() {
return getEnvironment().getProperty("mysql.password");
}
}
キーを解決できない場合、getProperty(String key)はnullを返します。