diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java index 91728f3fd07..3c3177d1eeb 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-idp/gravitee-apim-rest-api-idp-core/src/main/java/io/gravitee/rest/api/idp/core/plugin/impl/IdentityProviderManagerImpl.java @@ -16,6 +16,7 @@ package io.gravitee.rest.api.idp.core.plugin.impl; import io.gravitee.common.util.RelaxedPropertySource; +import io.gravitee.node.api.secrets.model.Secret; import io.gravitee.plugin.core.api.Plugin; import io.gravitee.plugin.core.api.PluginContextFactory; import io.gravitee.plugin.core.internal.AnnotationBasedPluginContextConfigurer; @@ -26,12 +27,17 @@ import io.gravitee.rest.api.idp.core.plugin.IdentityProviderDefinition; import io.gravitee.rest.api.idp.core.plugin.IdentityProviderManager; import java.util.*; +import javax.annotation.Nonnull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Import; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterFactory; +import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.StandardEnvironment; @@ -129,6 +135,22 @@ public ConfigurableEnvironment environment() { protected void customizePropertySources(MutablePropertySources propertySources) { propertySources.addFirst(new RelaxedPropertySource(plugin.id(), properties)); super.customizePropertySources(propertySources); + + // add missing converters in this newly created environment + // this syntax allows a property of any kind to be converted from a secret. eg. Secret +> String -> Double + this.getConversionService() + .addConverterFactory( + new ConverterFactory() { + final ConversionService conversionService = DefaultConversionService.getSharedInstance(); + + @Nonnull + public Converter getConverter(@Nonnull Class targetType) { + return source -> conversionService.convert(source.asString(), targetType); + } + } + ); + // byte[] has to be created separately + this.getConversionService().addConverter(Secret.class, String.class, Secret::asString); } }; }