วิธีกำหนด @Value เป็นทางเลือก


119

ฉันมีสิ่งต่อไปนี้ใน Spring bean:

@Value("${myValue}")
private String value;

ค่าถูกฉีดอย่างถูกต้อง อย่างไรก็ตามตัวแปรจำเป็นต้องเป็นทางเลือกซึ่งจะถูกส่งผ่านเป็นพารามิเตอร์บรรทัดคำสั่ง (ซึ่งจะถูกเพิ่มไปยังบริบท Spring โดยใช้SimpleCommandLinePropertySource ) และอาร์กิวเมนต์นี้จะไม่มีอยู่เสมอไป

ฉันได้ลองทั้งสองอย่างต่อไปนี้เพื่อระบุค่าเริ่มต้น:

@Value("${myValue:}")
@Value("${myValue:DEFAULT}")

แต่ในแต่ละกรณีอาร์กิวเมนต์เริ่มต้นหลังจากที่ลำไส้ใหญ่ถูกฉีดเข้าไปแม้ว่าจะมีค่าจริงก็ตาม - สิ่งนี้จะแทนที่สิ่งที่สปริงควรฉีด

อะไรคือวิธีที่ถูกต้องในการระบุว่าไม่จำเป็นต้องมี@Value

ขอบคุณ


นั่นเป็นเรื่องแปลกมาก ... ค่าเริ่มต้นควรทำหน้าที่เป็นค่าเริ่มต้นเท่านั้น (เช่นเมื่อไม่ได้กำหนดคุณสมบัติ) คุณสามารถตรวจสอบคำสั่งของคุณอีกครั้งได้หรือไม่ว่า "ค่าเริ่มต้นถูกฉีดเข้าไปแม้ว่าจะมีค่าจริงก็ตาม" (เช่นหากไม่มีคลาสที่คอมไพล์เก่า)
Pavel Horal

7
@Value("${some.prop:}")ทำงานให้ฉัน นั่นเป็นเพียงคำอธิบายประกอบของตัวแปรนั้น
Zarathustra

คุณสามารถโพสต์การกำหนดค่าแอปพลิเคชันของคุณได้หรือไม่
Vladimir Vagaytsev

@ อัตโนมัติ (จำเป็น = เท็จ)?
Andrew Scott Evans

คำตอบ:


179

อะไรคือวิธีที่ถูกต้องในการระบุว่าไม่จำเป็นต้องมี @Value

ทำงานบนสมมติฐานที่ว่า 'ไม่จำเป็น' หมายความว่าคุณnullแล้ว ...

คุณได้สังเกตอย่างถูกต้องว่าคุณสามารถระบุค่าเริ่มต้นทางด้านขวาของ:อักขระได้ @Value("${myValue:DEFAULT}")ตัวอย่างของคุณเป็น

คุณไม่ได้ จำกัด เฉพาะสตริงธรรมดาเป็นค่าเริ่มต้น คุณสามารถใช้นิพจน์SPELและนิพจน์ SPEL ง่ายๆที่จะส่งกลับnullคือ:

@Value("${myValue:#{null}}")

49

หากคุณใช้ Java 8 คุณสามารถใช้ประโยชน์จากjava.util.Optionalคลาสได้ คุณต้องประกาศตัวแปรตามวิธีนี้:

@Value("${myValue:#{null}}")
private Optional<String> value;

จากนั้นคุณสามารถตรวจสอบว่ามีการกำหนดค่าหรือไม่ด้วยวิธีที่ดีกว่า:

if (value.isPresent()) {
    // do something cool
}

หวังว่าจะช่วยได้!


4
ตามความคิดของ intelliJ. ไม่ใช่แนวทางปฏิบัติที่ดีที่สุดในการใช้Optionalประเภทในช่องชั้นเรียน
FıratKÜÇÜK

2
คุณทำสิ่งนี้และมันพ่น NPE valueเป็นโมฆะ
aatk

1
@aatk ดูเหมือนว่าปัญหาที่คุณอธิบายได้รับการแก้ไขแล้วอย่างน้อยตั้งแต่ 4.3.13 ฉันไม่มีปัญหาในการใช้คำประกาศที่อธิบายไว้ แม้ว่าจะดีกว่าถ้าใช้ค่าว่างเปล่า
Torben

2
"ตามแนวคิดของ intelliJ ไม่ใช่แนวทางปฏิบัติที่ดีที่สุดในการใช้ประเภทตัวเลือกในช่องชั้นเรียน" เกิดอะไรขึ้นกับการใช้ตัวเลือกเป็นตัวแปรอินสแตนซ์ เท่านั้นที่มีอายุค่อนข้างนานเมื่อเทียบกับเมื่อใช้ใน getters ... และฟิลด์ดังกล่าวควรถูกทำเครื่องหมายว่าเป็น Transient สำหรับการทำให้เป็นอนุกรม?
Andrey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.