ฉันสามารถตั้งค่า null เป็นค่าเริ่มต้นสำหรับ @Value ใน Spring ได้หรือไม่


105

ฉันกำลังใช้คำอธิบายประกอบ @Value Spring 3.1.x ดังนี้:

@Value("${stuff.value:}")
private String value;

สิ่งนี้ทำให้ String ว่างในตัวแปรหากไม่มีแอตทริบิวต์ ฉันต้องการให้ null เป็นค่าเริ่มต้นแทนที่จะเป็นสตริงว่าง แน่นอนฉันต้องการหลีกเลี่ยงข้อผิดพลาดเมื่อไม่ได้ตั้งค่าคุณสมบัติค่า

คำตอบ:


67

คุณต้องตั้ง nullValue ของPropertyPlaceholderConfigurer ตัวอย่างเช่นฉันใช้สตริง@nullแต่คุณสามารถใช้สตริงว่างเป็น nullValue ได้

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <!-- config the location(s) of the properties file(s) here -->
    <property name="nullValue" value="@null" />
</bean>

ตอนนี้คุณสามารถใช้สตริง@nullเพื่อแสดงnullค่าได้

@Value("${stuff.value:@null}")
private String value;

โปรดทราบ: ช่องว่างของชื่อบริบทไม่รองรับค่า null ในขณะนี้ คุณไม่สามารถใช้

<context:property-placeholder null-value="@null" ... />

ทดสอบด้วย Spring 3.1.1


2
การกำหนดค่า Java เทียบเท่ากับสิ่งนี้หรือไม่
Kumar Sambhav

31
stackoverflow.com/questions/9347929/…กล่าวถึงโดยใช้ $ {some.param: # {null}} ซึ่งใช้ได้ผลสำหรับฉันโดยไม่ต้องตั้งค่า nullValue ดูเหมือนว่านี่จะเป็นค่าเริ่มต้น? (ในแอปพลิเคชัน Spring Boot)
vorburger

5
ใช้พลังงานอย่างง่ายของ SPEL $ {stuff.value: # {null}} ตามคำแนะนำของ vorburger และในstackoverflow.com/questions/16735141/…
csf

ดูเหมือนว่าจำเป็นต้องมีการกำหนดค่าน้อยกว่ามากสำหรับคำตอบของ ben3000 และ JRichardsz
Jeff


56

ขอบคุณ @vorburger:

@Value("${email.protocol:#{null}}")
String protocol;

จะกำหนดค่าสตริงเป็นnullโดยไม่มีการกำหนดค่าอื่น ๆ


3
ทำงานใน spring-boot เวอร์ชัน 2019 ล่าสุด: 2.1.7 ปล่อย ... start.spring.io
JRichardsz

2

ฉันให้เครดิต @nosebrain เนื่องจากฉันไม่ทราบเกี่ยวกับ "null-value" แต่ฉันต้องการหลีกเลี่ยงการใช้ค่า null โดยเฉพาะอย่างยิ่งเนื่องจากยากที่จะแสดงnullในไฟล์คุณสมบัติ

แต่นี่เป็นอีกทางเลือกหนึ่งที่ใช้ null โดยไม่มี out null-valueดังนั้นมันจะใช้ได้กับตัวยึดคุณสมบัติ

public class MyObject {

   private String value;

   @Value("${stuff.value:@null}")
   public void setValue(String value) {
      if ("@null".equals(value)) this.value = null;
      else this.value = value;
   }
}

โดยส่วนตัวแล้วฉันชอบวิธีของฉันเพราะในภายหลังคุณอาจต้องการstuff.valueเป็นค่าที่คั่นด้วยจุลภาคหรืออาจจะเป็น Enum สวิตช์จะง่ายกว่า ยังง่ายกว่าในการทดสอบหน่วย :)

แก้ไข: ตามความคิดเห็นของคุณเกี่ยวกับการใช้ enums และความเห็นของฉันที่ไม่ใช้ null

@Component
public class MyObject {

    @Value("${crap:NOTSET}")
    private Crap crap;

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

ข้างต้นใช้งานได้ดีสำหรับฉัน คุณหลีกเลี่ยงโมฆะ หากไฟล์คุณสมบัติของคุณต้องการตั้งค่าอย่างชัดเจนว่าพวกเขาไม่ต้องการจัดการมันคุณก็ทำ ( แต่คุณไม่จำเป็นต้องระบุสิ่งนี้เนื่องจากจะตั้งค่าเริ่มต้นเป็น NOTSET )

crap=NOTSET

nullNOTSETจะไม่ดีมากและมีความแตกต่างกว่า หมายความว่าการทดสอบสปริงหรือหน่วยไม่ได้ตั้งค่าไว้ซึ่งเป็นสาเหตุที่ทำให้ IMHO มีความแตกต่าง ฉันยังคงใช้สัญกรณ์ setter (ตัวอย่างก่อนหน้า) เป็นการทดสอบหน่วยที่ง่ายกว่า (ตัวแปรส่วนตัวยากที่จะตั้งค่าในการทดสอบหน่วย)


ค่า String เป็นตัวอย่างฉันต้องการสิ่งนี้สำหรับค่า Enum โดยที่ String ว่างทำให้เกิดข้อผิดพลาดในการแปลง ด้วย @null คุณสามารถมีค่าว่างเป็น "ไม่ตั้งค่า Enum" ซึ่งเป็นสิ่งที่ฉันต้องการ
Kevin Schmidt

เหตุผลเพิ่มเติมว่าทำไมฉันไม่แนะนำ null แต่เป็น enum ที่แสดงถึง not set แทน
Adam Gent

2
นั่นจะต้องใส่ Enum.NOTSET ลงในไฟล์คุณสมบัติทั้งหมด (> 30) ซึ่งดูเหมือนจะใช้งานได้มากและแทบไม่มีประโยชน์เลย ...
Kevin Schmidt

ฉันไม่ได้ลอง แต่ในทางทฤษฎีใช้ไม่ได้@Value("${stuff.value:NOTSET}")?
Adam Gent

ใช่นี่เป็นทางออกที่ดี น่าเสียดายที่ฉันไม่สามารถเปลี่ยน enum (dep) ได้ดังนั้นฉันจึงต้องใช้ null มิฉะนั้นคุณจะถูกต้อง NOTSET จะใช้งานได้
Kevin Schmidt

0

ในกรณีที่คุณต้องการฉีดสตริงว่าง (0 length) "" เป็นค่าเริ่มต้น @Value - ใช้ SPEL (ภาษานิพจน์สปริง) ดังนี้:

@Value("${index.suffix:#{''}}") 
private String indexSuffix;

# {''} ทำให้คุณได้รับสตริงว่างเป็นค่าเริ่มต้นของค่าแทรก @

โดย yl

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.