Respostas:
Estendendo a boa e simples resposta de User1648825 (não posso comentar e minha edição foi rejeitada):
@Value("${spring.profiles.active}")
private String activeProfile;
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:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... activeProfile agora contém 'Desconhecido' se spring.profiles.active não pôde ser resolvido
Aqui está um exemplo mais completo.
Ambiente Autowire
Primeiro, você desejará conectar automaticamente o bean de ambiente.
@Autowired
private Environment environment;
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 pega String[]
from getActiveProfiles()
, 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.
//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("test")
|| env.equalsIgnoreCase("local")) ))
{
doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("prod")) ))
{
doSomethingForProd();
}
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 mola
@Value("${spring.profiles.active}")
private String activeProfile;
Funciona e você não precisa implementar o EnvironmentAware. Mas não conheço desvantagens dessa abordagem.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Os aplicativos também podem usar a spring.profiles.include
propriedade e podem definir perfis programaticamente durante a inicialização usando ConfigurableEnvironment
. 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
Parece que há alguma demanda para poder acessar isso estaticamente.
Como posso obter essa coisa em métodos estáticos em classes não gerenciadas por mola? - Aetherus
É 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.
@Component
public class SpringContext
{
private static Environment environment;
public SpringContext(Environment environment) {
SpringContext.environment = environment;
}
public static Environment getEnvironment() {
if (environment == null) {
throw new RuntimeException("Environment has not been set yet");
}
return environment;
}
}