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 -Dkey=value. Exemple : -Dapp.name=MyApp

Variables d’environnement

300

Variables d’environnement du système d’exploitation. Mappage automatique : APP_NAMEapp.name, my_propertymy.property

microprofile-config.properties

100

Fichier de propriétés à META-INF/microprofile-config.properties dans le classpath. Format de propriétés Java standard.

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 :

  1. Définir la propriété système : java -Dmy.key=overridden MyApp

  2. Ou définir la variable d’environnement : MY_KEY=overridden java MyApp

  3. Ou implémenter une ConfigSource personnalisée avec ordinal > 300

Suivant