Làm thế nào để bạn có được hồ sơ Môi trường hoạt động / mặc định hiện tại theo chương trình trong Spring?


155

Tôi cần mã logic khác nhau dựa trên hồ sơ môi trường hiện tại khác nhau. Làm thế nào bạn có thể nhận được các cấu hình hoạt động và mặc định hiện tại từ Spring?


3
@aweigold: nhận hồ sơ Môi trường hoạt động / mặc định hiện tại theo chương trình vào mùa xuân 3.1. bạn cần thêm chi tiết gì?
Bobo

Câu trả lời:



75

Mở rộng câu trả lời đơn giản hay của User1648825 (Tôi không thể nhận xét và chỉnh sửa của tôi đã bị từ chối):

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

Điều này có thể ném IllegalArgumentException nếu không có cấu hình nào được đặt (tôi nhận được giá trị null). Đây có thể là một điều tốt nếu bạn cần thiết lập nó; nếu không sử dụng cú pháp 'mặc định' cho @Value, nghĩa là:

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

... activeProfile hiện chứa 'Unknown' nếu spring.profiles.active không thể được giải quyết


Tên hồ sơ được phân tách bằng dấu phẩy. Thanh toán baeldung.com/spring-profiles#2-USE-springactiveprofile
Jason

56

Dưới đây là một ví dụ đầy đủ hơn.

Môi trường tự động

Trước tiên, bạn sẽ muốn autowire môi trường bean.

@Autowired
private Environment environment;

Kiểm tra xem Hồ sơ có tồn tại trong Hồ sơ hoạt động không

Sau đó, bạn có thể sử dụng getActiveProfiles()để tìm hiểu xem hồ sơ tồn tại trong danh sách các hồ sơ hoạt động. Dưới đây là một ví dụ lấy String[]từ getActiveProfiles(), lấy một luồng từ mảng đó, sau đó sử dụng các công cụ đối sánh để kiểm tra nhiều hồ sơ (Case-Insensitive) trả về một boolean nếu chúng tồn tại.

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

Bạn cũng có thể đạt được chức năng tương tự bằng cách sử dụng @Profile("local")Cấu hình chú thích cho phép cấu hình chọn lọc dựa trên tham số môi trường hoặc thông qua. Dưới đây là thông tin thêm về kỹ thuật này: Hồ sơ mùa xuân


2
@Profile có vẻ như là giải pháp tốt nhất.
Paul Waldo

Tôi bị mù bởi các dòng riêng biệt cho mỗi nẹp xoăn. Không phải tiêu chuẩn mã hóa Java.
dùng1567291

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

Nó hoạt động và bạn không cần phải thực hiện Môi trường. Nhưng tôi không biết nhược điểm của phương pháp này.


3
Dòng này đưa ra lỗi này:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus

Hoạt động hoàn hảo cho tôi. Sử dụng Spring Boot 1.5.15.
hôm nay

Tôi nghĩ rằng nếu hồ sơ được xác định, giá trị sẽ được phân tích cú pháp, nếu không ngoại lệ phát sinh. Không phù hợp với mọi tình huống.
WesternGun

1
Hồ sơ hoạt động cũng có thể là một mảng, xin vui lòng chú ý đến điều đó. Sử dụng cách đó bạn có thể gặp lỗi không mong muốn khi thêm hồ sơ bổ sung.
Alex Efimov

Hạn chế của phương pháp này là nó sẽ không nhận được tất cả các cấu hình mà Spring có thể xem xét khi đánh giá @Profile. Ứng dụng cũng có thể sử dụng thuộc spring.profiles.include tính và có thể thiết lập các cấu hình theo chương trình trong quá trình khởi tạo bằng cách sử dụng ConfigurableEnvironment. Environment.getActiveProfiles()sẽ nhận được danh sách đầy đủ các cấu hình được thiết lập bằng cách sử dụng bất kỳ cơ chế nào trong số này.
Scott Frederick

14

Nếu bạn không sử dụng tự động, chỉ cần thực hiện EnvironmentAware


0

Có vẻ như có một số nhu cầu để có thể truy cập tĩnh này.

Làm thế nào tôi có thể có được điều đó trong các phương thức tĩnh trong các lớp không được quản lý mùa xuân? - Aetherus

Đó là một hack, nhưng bạn có thể viết lớp của riêng bạn để phơi bày nó. Bạn phải cẩn thận để đảm bảo rằng không có gì sẽ gọi SpringContext.getEnvironment()trước khi tất cả các hạt được tạo ra, vì không có gì đảm bảo khi thành phần này sẽ được khởi tạo.

@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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.