Preciso codificar lógica diferente com base no perfil de ambiente atual diferente. Como você pode obter os perfis ativos e padrão atuais do Spring?
java
spring
spring-profiles
Bobo
fonte
fonte
Respostas:
Você pode instalar automaticamente o
Environment
Environment
ofertas:String[] getActiveProfiles()
,String[] getDefaultProfiles()
eboolean acceptsProfiles(String... profiles)
fonte
Estendendo a boa e simples resposta de User1648825 (não posso comentar e minha edição foi rejeitada):
Isso pode gerar uma IllegalArgumentException se nenhum perfil estiver definido (eu recebo um valor nulo). Isso pode ser uma coisa boa se você precisar que seja definido; caso contrário, use a sintaxe 'padrão' para @Value, ou seja:
... activeProfile agora contém 'Desconhecido' se spring.profiles.active não pôde ser resolvido
fonte
Aqui está um exemplo mais completo.
Ambiente Autowire
Primeiro, você desejará conectar automaticamente o bean de ambiente.
Verifique se existem perfis no Active Profiles
Em seguida, você pode usar
getActiveProfiles()
para descobrir se o perfil existe na lista de perfis ativos. Aqui está um exemplo que pegaString[]
fromgetActiveProfiles()
, obtém um fluxo dessa matriz e usa matchers para verificar vários perfis (sem distinção entre maiúsculas e minúsculas) que retornam um valor booleano, se existirem.Você também pode obter funcionalidade semelhante usando os
@Profile("local")
Perfis de anotação que permitem a configuração seletiva com base em um parâmetro passado ou no ambiente. Aqui estão mais informações sobre esta técnica: Perfis de molafonte
Funciona e você não precisa implementar o EnvironmentAware. Mas não conheço desvantagens dessa abordagem.
fonte
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Os aplicativos também podem usar aspring.profiles.include
propriedade e podem definir perfis programaticamente durante a inicialização usandoConfigurableEnvironment
.Environment.getActiveProfiles()
obterá a lista completa dos perfis definidos usando qualquer um desses mecanismos.Se você não estiver usando fiação automática, basta implementar
EnvironmentAware
fonte
Parece que há alguma demanda para poder acessar isso estaticamente.
É um truque, mas você pode escrever sua própria classe para expô-lo. Você deve ter cuidado para garantir que nada será chamado
SpringContext.getEnvironment()
antes que todos os beans tenham sido criados, pois não há garantia de quando esse componente será instanciado.fonte