spring-cloud-starter-aws использует spring-cloud-aws-autoconfigure, который предоставляет следующие конфигурации, связанные с AWS:
org.springframework.cloud.aws.autoconfigure.context.ContextInstanceDataAutoConfiguration
org.springframework.cloud.aws.autoconfigure.context.ContextCredentialsAutoConfiguration
org.springframework.cloud.aws.autoconfigure.context.ContextRegionProviderAutoConfiguration
org.springframework.cloud.aws.autoconfigure.context.ContextResourceLoaderAutoConfiguration
org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration
org.springframework.cloud.aws.autoconfigure.mail.MailSenderAutoConfiguration
org.springframework.cloud.aws.autoconfigure.cache.ElastiCacheAutoConfiguration
org.springframework.cloud.aws.autoconfigure.messaging.MessagingAutoConfiguration
org.springframework.cloud.aws.autoconfigure.jdbc.AmazonRdsDatabaseAutoConfiguration
org.springframework.cloud.aws.autoconfigure.metrics.CloudWatchExportAutoConfiguration
Все они запускаются EnableAutoConfiguration. Если вы можете жить без EnableAutoConfiguration, ваша проблема решена. Однако, поскольку вы используете spring-cloud-starter-aws, я не ожидаю, что это так.
К сожалению, только ContextInstanceDataAutoConfiguration и ContextInstanceDataAutoConfiguration используют @ConditionalOnAwsCloudEnvironment, остальные конфигурации запускаются независимо от среды. Большинство из них обусловлено только чем-то похожим на следующее (этот пример взят из ContextCredentialsAutoConfiguration):
@ConditionalOnClass(name = {"com.amazonaws.auth.AWSCredentialsProvider"})
Чтобы не запускать такую конфигурацию, вам необходимо удалить класс com.amazonaws.auth.AWSCredentialsProvider из пути к классам. Этого можно достичь с помощью профилей maven или причудливой модульности, но я считаю, что это обычно неоптимальное решение, поскольку такая реструктуризация проекта имеет значительные побочные эффекты.
Я считаю, что самое простое решение - удалить spring-cloud-aws-autoconfigure из зависимостей проекта и написать собственные версии класса конфигурации. Вот версия ContextCredentialsAutoConfiguration, которая сработала для меня:
import mu.KLogging
import org.springframework.beans.factory.support.BeanDefinitionRegistry
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
import org.springframework.cloud.aws.context.config.annotation.ContextDefaultConfigurationRegistrar
import org.springframework.cloud.aws.context.config.support.ContextConfigurationUtils
import org.springframework.context.EnvironmentAware
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Import
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar
import org.springframework.context.annotation.Profile
import org.springframework.core.env.Environment
import org.springframework.core.type.AnnotationMetadata
@Configuration
@Import(ContextDefaultConfigurationRegistrar::class, AwsContextCredentialsAutoConfiguration.Registrar::class)
@ConditionalOnClass(name = ["com.amazonaws.auth.AWSCredentialsProvider"])
@Profile("!it")
class AwsContextCredentialsAutoConfiguration {
class Registrar : ImportBeanDefinitionRegistrar, EnvironmentAware {
companion object: KLogging()
private var environment: Environment? = null
override fun setEnvironment(environment: Environment) {
this.environment = environment
}
override fun registerBeanDefinitions(importingClassMetadata: AnnotationMetadata, registry: BeanDefinitionRegistry) {
val useDefaultCredentialsChain = this.environment!!.getProperty("cloud.aws.credentials.useDefaultAwsCredentialsChain", Boolean::class.java, false)
if (useDefaultCredentialsChain) {
logger.debug("Using default AWS credentials provider")
ContextConfigurationUtils.registerDefaultAWSCredentialsProvider(registry)
} else {
logger.debug("Using custom credentials provider (based on environment properties)")
ContextConfigurationUtils.registerCredentialsProvider(
registry,
this.environment!!.getProperty("cloud.aws.credentials.accessKey"),
this.environment!!.getProperty("cloud.aws.credentials.secretKey"),
this.environment!!.getProperty("cloud.aws.credentials.instanceProfile", Boolean::class.java, true) as Boolean && !this.environment!!.containsProperty("cloud.aws.credentials.accessKey"),
this.environment!!.getProperty("cloud.aws.credentials.profileName", "default"),
this.environment!!.getProperty("cloud.aws.credentials.profilePath"))
}
}
}
}
Обратите внимание на аннотацию @Profile ("! It"), это профиль, включенный для интеграционных тестов. Как следствие, конфигурация игнорируется во время интеграционных тестов, но вы можете заменить ее профилем, который вы используете для своего локального контекста.
person
Marian
schedule
09.05.2018