Як ви отримуєте поточний активний / типовий профіль навколишнього середовища програмно навесні?


155

Мені потрібно кодувати різну логіку на основі різних поточних профілів оточення. Як можна отримати поточні активні та типові профілі від Spring?


3
@aweigold: навесні 3.1 програмно отримуйте поточний активний / типовий профіль навколишнього середовища. які ще деталі вам потрібні?
Бобо

Відповіді:



75

Розширення простої відповіді User1648825 (я не можу коментувати, і мою редакцію відхилено):

@Value("${spring.profiles.active}")
private String activeProfile;

Це може викинути IllegalArgumentException, якщо не встановлені профілі (я отримую нульове значення). Це може бути хорошою справою, якщо вам потрібно її встановити; якщо не використовувати синтаксис 'за замовчуванням' для @Value, тобто:

@Value("${spring.profiles.active:Unknown}")
private String activeProfile;

... activeProfile тепер містить "Невідомо", якщо spring.profiles.active не вдалося вирішити


Імена профілю розділені комою. Оформити замовлення baeldung.com/spring-profiles#2-using-springactiveprofile
Джейсон

56

Ось більш повний приклад.

Автомобільне середовище

По-перше, вам захочеться автоматично з'єднати середовище.

@Autowired
private Environment environment;

Перевірте, чи існують профілі в активних профілях

Потім ви можете getActiveProfiles()дізнатися, чи існує профіль у списку активних профілів. Ось приклад, який бере String[]з getActiveProfiles(), отримує потік з цього масиву, а потім використовує matchers для перевірки наявності декількох профілів (Case-Insensitive), які повертають булеві, якщо вони існують.

//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();
}

Ви також можете досягти подібних функціональних можливостей за допомогою анотації. @Profile("local")Профілі дозволяють здійснювати селективну конфігурацію на основі параметра, що передається або середовища. Ось додаткова інформація про цю техніку: Весняні профілі


2
@Profile здається найкращим рішенням.
Пол Уолдо

Мене засліплюють окремими лініями для кожного фігурного дужка. Не стандарти кодування Java.
користувач1567291

26
@Value("${spring.profiles.active}")
private String activeProfile;

Він працює, і вам не потрібно впроваджувати EnvironmentAware. Але я не знаю недоліків такого підходу.


3
Цей рядок дає цю помилку:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus

Для мене прекрасно працює. Використання весняного завантаження 1.5.15.
рüффп

Я думаю, якщо профіль буде визначений, значення буде проаналізовано, інакше виникне виняток. Підходить не для всіх ситуацій.
WesternGun

1
Активний профіль також може бути масивом, зверніть на це увагу. Використовуючи такий спосіб, ви можете отримати несподівану помилку при додаванні додаткових профілів.
Олексій Єфімов

Недолік цього підходу полягає в тому, що він не отримає всіх профілів, які Весна може врахувати при оцінці @Profile. Програми також можуть використовувати spring.profiles.include властивість та можуть програматично встановлювати профілі під час ініціалізації ConfigurableEnvironment. Environment.getActiveProfiles()отримає повний список профілів, встановлених за допомогою будь-якого з цих механізмів.
Скотт Фредерік


0

Здається, є певний попит на доступ до цього статично.

Як я можу отримати таке в статичних методах у класах, що не керуються весною? - Ефір

Це хак, але ви можете написати власний клас, щоб викрити його. Ви повинні бути обережними, щоб нічого не зателефонувати SpringContext.getEnvironment()до створення всіх бобів, оскільки немає гарантії, коли цей компонент буде інстанційним.

@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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.