คุณจะรับโปรไฟล์สภาพแวดล้อมที่แอ็คทีฟ / ค่าเริ่มต้นปัจจุบันโดยทางโปรแกรมใน Spring ได้อย่างไร


155

ฉันต้องการรหัสตรรกะที่แตกต่างกันตามโปรไฟล์สภาพแวดล้อมปัจจุบัน คุณจะรับโปรไฟล์ที่ใช้งานและเริ่มต้นปัจจุบันจาก Spring ได้อย่างไร


3
@aweigold: รับโปรไฟล์สภาพแวดล้อมที่เปิดใช้งาน / เป็นค่าเริ่มต้นโดยทางโปรแกรมในฤดูใบไม้ผลิ 3.1 คุณต้องการรายละเอียดอะไรเพิ่มเติม
Bobo

คำตอบ:


225

คุณสามารถตอบรับอัตโนมัติ Environment

@Autowired
Environment env;

Environment ข้อเสนอ:


6
ฉันจะได้รับสิ่งนั้นในวิธีการคงที่ในชั้นเรียนที่ไม่มีสปริงจัดการได้อย่างไร
Aetherus

75

คำตอบง่ายๆที่ดีของ User1648825 การขยาย (ฉันไม่สามารถแสดงความคิดเห็นและแก้ไขของฉันถูกปฏิเสธ):

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

สิ่งนี้อาจส่ง IllegalArgumentException หากไม่มีการตั้งค่าโปรไฟล์ (ฉันได้รับค่า Null) นี่อาจเป็นสิ่งที่ดีหากคุณต้องการตั้งค่า หากไม่ใช้ไวยากรณ์ 'default' สำหรับ @Value เช่น:

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

... activeProfile ตอนนี้มี 'ไม่ทราบ' หากไม่สามารถแก้ไข spring.profiles.active


ชื่อโปรไฟล์ถูกคั่นด้วยเครื่องหมายจุลภาค ชำระเงินbaeldung.com/spring-profiles#2-using-springactiveprofile
Jason

56

นี่คือตัวอย่างที่สมบูรณ์มากขึ้น

สภาพแวดล้อม Autowire

ก่อนอื่นคุณจะต้องป้อนสภาวะแวดล้อมให้อัตโนมัติ

@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")อนุญาตให้ใช้สำหรับการกำหนดค่าที่เลือกตามพารามิเตอร์การส่งผ่านหรือสภาพแวดล้อม นี่คือข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคนี้: Spring Profiles


2
@ โปรไฟล์ดูเหมือนว่าทางออกที่ดีที่สุด
Paul Waldo

ฉันตาบอดด้วยเส้นแยกจากกันสำหรับวงเล็บปีกกาแต่ละอัน ไม่ใช่มาตรฐานการเข้ารหัสของ Java
user1567291

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

ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน ใช้ Spring Boot 1.5.15
рüффп

ฉันคิดว่าถ้ามีการกำหนดโปรไฟล์จะมีการแยกวิเคราะห์ค่ามิฉะนั้นจะเกิดข้อยกเว้น ไม่เหมาะกับทุกสถานการณ์
WesternGun

1
โปรไฟล์ที่ใช้งานอาจเป็นอาเรย์โปรดใส่ใจด้วย การใช้วิธีดังกล่าวคุณจะได้รับข้อผิดพลาดที่ไม่คาดคิดในการเพิ่มโปรไฟล์เพิ่มเติม
Alex Efimov

@Profileข้อเสียเปรียบแนวทางนี้ก็คือว่ามันจะไม่ได้รับทั้งหมดของโปรไฟล์ที่ฤดูใบไม้ผลิอาจพิจารณาเมื่อมีการประเมิน ปพลิเคชันสามารถใช้ทรัพย์สินและสามารถตั้งค่าโปรไฟล์โปรแกรมในระหว่างการเตรียมใช้spring.profiles.include จะได้รับรายการทั้งหมดของโปรไฟล์ที่ตั้งค่าโดยใช้กลไกใด ๆ เหล่านี้ ConfigurableEnvironmentEnvironment.getActiveProfiles()
Scott Frederick


0

ดูเหมือนว่ามีความต้องการที่จะสามารถเข้าถึงแบบคงที่นี้

ฉันจะได้รับสิ่งนั้นในวิธีการคงที่ในชั้นเรียนที่ไม่มีสปริงจัดการได้อย่างไร - Aetherus

มันเป็นแฮ็ค แต่คุณสามารถเขียนคลาสของคุณเองเพื่อแสดงมัน คุณต้องระมัดระวังเพื่อให้แน่ใจว่าไม่มีสิ่งใดที่จะเรียก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;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.