Estou construindo um módulo de biblioteca como um auxiliar para construir imagens nativas para aplicativos Spring, por exemplo, adicionando o processador de bean AOT e filtros. Também preciso definir algumas propriedades Spring durante o AOT que então ativariam algumas definições de bean para serem encontradas e registradas durante o AOT.
Sendo uma biblioteca, não tenho controle sobre o aplicativo que está sendo construído, então não posso usar arquivos de propriedades ou variáveis de ambiente para definir propriedades. Tentei usar, EnvironmentPostProcessor
mas parece que não é avaliado durante o processamento AOT:
class EnableKubernetesEnvironemntPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
environment.getPropertySources().addFirst(new MapPropertySource("enableKubernetes", Map.of(
"spring.main.cloud.platform", "kubernetes",
"spring.profiles.active", "kubernetes",
"management.server.port", "9000"
)));
}
}
Como posso programaticamente definir uma propriedade Spring durante o processamento AOT? É possível disparar EnvironmentPostProcessor
durante AOT?
Em particular, preciso definir spring.main.cloud.platform=kubernetes
e, spring.profiles.active=kubernetes
assim, o AOT coleta beans condicionais a essas propriedades, para management.server.port
que o AOT saiba usar um contêiner diferente para o Atuador.
Esperamos que este projeto de amostra forneça o que você precisa.
A propriedade da plataforma de nuvem estava errada. Deveria estar
spring.main.cloud-platform
. Para casos como esse, é sempre melhor tentar manualmente em um aplicativo e depois mudar para umEnvironmentPostProcessor
.Então você provavelmente não quer que essas coisas se apliquem quando você executa qualquer aplicativo que tenha a biblioteca. Para mitigar isso, você pode verificar se está executando o processamento AOT e habilitar apenas esse comportamento lá.
Aqui está o código
Não tenho 100% de certeza do porquê definir a propriedade de perfil não a habilita, mas manipulá-la
Environment
diretamente é melhor de qualquer maneira.