Sources built-in
Ravel fournit trois sources de configuration built-in, chargées automatiquement dans cet ordre (par ordinal) :
| Source | Ordinal | Description |
|---|---|---|
Propriétés système |
400 |
Propriétés système Java définies via |
Variables d’environnement |
300 |
Variables d’environnement du système d’exploitation. Mappage automatique : |
microprofile-config.properties |
100 |
Fichier de propriétés à |
Sources de configuration personnalisées via SPI
Pour implémenter une source de configuration personnalisée, créez une classe implémentant ConfigSource :
import org.eclipse.microprofile.config.spi.ConfigSource;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MyCustomConfigSource implements ConfigSource {
@Override
public Map<String, String> getProperties() {
Map<String, String> props = new HashMap<>();
props.put("my.custom.key", "my.custom.value");
return props;
}
@Override
public String getValue(String propertyName) {
if ("my.custom.key".equals(propertyName)) {
return "my.custom.value";
}
return null;
}
@Override
public String getName() {
return "MyCustomConfigSource";
}
@Override
public int getOrdinal() {
return 150; // Entre microprofile-config.properties et les variables d'environnement
}
}
S’enregistrer via ServiceLoader
Créez un fichier META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource :
com.example.MyCustomConfigSource
Ravel découvrira et utilisera automatiquement votre source personnalisée.
Exemple : Source de configuration base de données
public class DatabaseConfigSource implements ConfigSource {
private final DataSource dataSource;
private final String tableName;
public DatabaseConfigSource(DataSource ds, String table) {
this.dataSource = ds;
this.tableName = table;
}
@Override
public Map<String, String> getProperties() {
Map<String, String> result = new HashMap<>();
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(
"SELECT config_key, config_value FROM " + tableName)) {
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
result.put(rs.getString("config_key"),
rs.getString("config_value"));
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return result;
}
@Override
public String getValue(String propertyName) {
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(
"SELECT config_value FROM " + tableName
+ " WHERE config_key = ?")) {
stmt.setString(1, propertyName);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return rs.getString("config_value");
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return null;
}
@Override
public String getName() {
return "DatabaseConfigSource";
}
@Override
public int getOrdinal() {
return 250; // Priorité plus élevée que microprofile-config.properties
}
}
ConfigSourceProvider
Pour des sources de configuration dynamiques (p. ex., fournir plusieurs sources en fonction de conditions runtime), implémentez ConfigSourceProvider :
import org.eclipse.microprofile.config.spi.ConfigSourceProvider;
public class DirectoryConfigSourceProvider implements ConfigSourceProvider {
@Override
public Iterable<ConfigSource> getConfigSources(ClassLoader forClassLoader) {
List<ConfigSource> sources = new ArrayList<>();
// Scannez un répertoire pour les fichiers .properties
Path dir = Paths.get("/etc/myapp/config");
if (Files.exists(dir)) {
try (Stream<Path> files = Files.list(dir)) {
files.filter(p -> p.toString().endsWith(".properties"))
.forEach(p -> sources.add(new PropertiesFileSource(p)));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return sources;
}
}
Enregistrez via META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider :
com.example.DirectoryConfigSourceProvider
Valeurs d’ordinal
Lorsque plusieurs sources définissent la même clé, Ravel utilise d’abord l'ordinal le plus élevé. Valeurs courantes :
| Ordinal | Usage |
|---|---|
400 |
Propriétés système (built-in) |
300 |
Variables d’environnement (built-in) |
250 |
Sources personnalisées de haute priorité (p. ex., base de données) |
100 |
microprofile-config.properties (built-in) |
50 |
Sources personnalisées de basse priorité |
Ordinal plus élevé = priorité plus élevée. S’il n’est pas spécifié, l’ordinal par défaut est ConfigSource.CONFIG_ORDINAL_DEFAULT (== 100).
Surcharger les sources
Ravel respecte strictement les ordinaux des sources. Pour toujours surcharger une valeur de microprofile-config.properties :
-
Définir la propriété système :
java -Dmy.key=overridden MyApp -
Ou définir la variable d’environnement :
MY_KEY=overridden java MyApp -
Ou implémenter une
ConfigSourcepersonnalisée avec ordinal > 300
Suivant
-
Convertisseurs de types — convertir les valeurs de chaîne en objets typés
-
Expressions de propriété — référencer d’autres propriétés