Search code examples
javahelidon

Not able to set up Custom Config Source in Helidon Mp


I have made the changes as suggested in the doc : https://helidon.io/docs/v2/#/mp/config/02_MP_config_sources But it is not able to identify the new config source and gives the following error : Config source of type test-config-provider is not supported`

Here are the changes that I have done to add the new Custom Config Source :

  1. Created a MyConfigProvider class which implements MpMetaConfigProvider
  2. Created class MyConfigSource which implements ConfigSource
  3. MyConfigProvider::create() and supportedTypes()
public static final String TYPE = "test-config-provider";

@Override
public List<? extends ConfigSource> create(String s, Config config, String s1) {
    Map<String, String> result = new HashMap<String, String>();
    ConfigSource configSource = new MyConfigSource(result);
    return Collections.singletonList(configSource);
}

  @Override
    public Set<String> supportedTypes() {
        return Set.of(TYPE);
    }
  1. Inside resources/META-INF, added services/io.helidon.config.mp.spi.MpMetaConfigProvider file. In the file added the file package path for MyConfigProvider i.e <package_name>.MyConfigProvider
  2. File : 'mp-meta-config.yaml' contents add-discovered-sources: true add-discovered-converters: false add-default-sources: true

sources:

  • type: "environment-variables"
  • type: "system-properties"
  • type: "test-config-provider"
  1. In my main() function we are creating the Config instance and passing it to the Server builder()

public class Main {
private static final String DEFAULT_CONFIG_FILE = "mp-meta-config.yaml";
public static void main(final String\[\] args) {

       Config config = buildHelidonConfig();
       Server server = startServer1(config);
        //Server server = startServer2();
    }
    
    private static Config buildHelidonConfig() {
        return MetaConfig.config(Config.create(getSources()));
    }private static Supplier<? extends ConfigSource>[] getSources() {
        return new Supplier[] {
                classpath(DEFAULT_CONFIG_FILE).build()
        };
    }
    public static Server startServer1(Config config) {
        return Server
                .builder()
                .config(config)
                .build()
                .start();
    
    }

}

But it is not able to identify the new config source and gives the following error :

Config source of type test-config-provider is not supported


Solution

  • io.helidon.config.Config and org.eclipse.microprofile.config.Config are different APIs.

    Helidon provides an implementation of MicroProfile Config with the following Maven dependency io.helidon.config:helidon-config-mp.

    You can create an instance like this:

    org.eclipse.microprofile.config.ConfigProvider.getConfig()
    

    Helidon also provides a few SPIs along its implementation of MicroProfile Config, one of which is io.helidon.config.mp.spi.MpMetaConfigProvider.

    When creating an instance of MicroProfile using the above, implementations of MpMetaConfigProvider are used.


    Helidon also provides a bridge to create instances of MicroProfile Config backed by io.helidon.config.Config.

    // create an instance of "Helidon Config"
    io.helidon.config.Config config0 = io.helidon.config.Config.create();
            
    // create an instance of "MicroProfile Config" backed by "Helidon Config"
    org.eclipse.microprofile.config.Config config =
            ConfigProviderResolver.instance()
                                  .getBuilder()
                                  .withSources(MpConfigSources.create(config0))
                                  .build();
    

    The code above will NOT use implementations of MpMetaConfigProvider.


    In order for your code to pickup your implementation of MpMetaConfigProvider you can either:

    • Use the built-in main class
    • Use Server.Builder(org.eclipse.microprofile.config.Config) instead of Server.Builder(io.helidon.config.Config) with an instance created using ConfigProvider.getConfig()