Kann ich im Frühjahr null als Standardwert für einen @Wert festlegen?

98

Ich verwende derzeit die Annotation @Value Spring 3.1.x wie folgt:

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

Dadurch wird ein leerer String in die Variable eingefügt, wenn das Attribut nicht vorhanden ist. Ich möchte null als Standard anstelle einer leeren Zeichenfolge haben. Natürlich möchte ich auch einen Fehler vermeiden, wenn die Eigenschaft stuff.value nicht gesetzt ist.

Kevin Schmidt
quelle

Antworten:

66

Sie müssen den Nullwert des PropertyPlaceholderConfigurer festlegen . Für das Beispiel verwende ich die Zeichenfolge, @nullaber Sie können die leere Zeichenfolge auch als nullValue verwenden.

<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>

Jetzt können Sie die Zeichenfolge verwenden @null, um den nullWert darzustellen

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

Bitte beachten Sie: Der Kontextnamenraum unterstützt den Nullwert derzeit nicht. Sie können nicht verwenden

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

Getestet mit Feder 3.1.1

Nasenhirn
quelle
2
Was entspricht der Java-Konfiguration?
Kumar Sambhav
30
stackoverflow.com/questions/9347929/… erwähnt die Verwendung von $ {some.param: # {null}}, und das hat bei mir funktioniert, ohne nullValue setzen zu müssen. Scheint dies die Standardeinstellung zu sein? (In einer Spring Boot-Anwendung.)
Vorburger
5
Einfache Nutzung der Leistung von SPEL $ {stuff.value: # {null}}, wie von vorburger und in stackoverflow.com/questions/16735141/…
csf
Für ben3000- und JRichardsz-Antworten scheint viel weniger Konfiguration erforderlich zu sein.
Jeff
191

Das ist wirklich alt, aber Sie können Spring EL jetzt verwenden, z

@Value("${stuff.value:#{null}}")

Siehe diese Frage .

ben3000
quelle
48

Danke an @vorburger:

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

setzt den String-Wert ohne andere Konfigurationen auf null .

Kirill Ch
quelle
3
arbeitete in Spring-Boot letzte 2019 Version: 2.1.7.RELEASE ... start.spring.io
JRichardsz
2

Ich gebe @nosebrain Kredit, da ich nicht über "Nullwert" Bescheid wusste, aber ich bevorzuge es, die Verwendung von Nullwerten insgesamt zu vermeiden, insbesondere da es schwierig ist, sie nullin einer Eigenschaftendatei darzustellen .

Aber hier ist eine Alternative, bei der null ohne verwendet wird, null-valuedamit sie mit jedem Platzhalter für Eigenschaften funktioniert.

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;
   }
}

Persönlich bevorzuge ich meinen Weg, weil Sie vielleicht später stuff.valueein durch Kommas getrennter Wert sein möchten oder vielleicht ist es einfacher, den Schalter aufzuschreiben. Es ist auch einfacher zu testen :)

BEARBEITEN: basierend auf Ihren Kommentaren zur Verwendung von Aufzählungen und meiner Meinung, keine Null zu verwenden.

@Component
public class MyObject {

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

    public enum Crap {
        NOTSET,
        BLAH;
    }
}

Das obige funktioniert gut für mich. Sie vermeiden null. Wenn Ihre Eigenschaftendateien explizit festlegen möchten, dass sie nicht damit umgehen möchten, tun Sie dies ( aber Sie müssen dies nicht einmal angeben, da dies standardmäßig NOTSET ist ).

crap=NOTSET

nullist sehr schlecht und ist anders als NOTSET. Dies bedeutet, dass der Feder- oder Komponententest ihn nicht eingestellt hat, weshalb IMHO ein Unterschied besteht. Ich würde wahrscheinlich immer noch die Setter-Notation (vorheriges Beispiel) verwenden, um den Unit-Test zu vereinfachen (private Variablen sind in einem Unit-Test schwer zu setzen).

Adam Gent
quelle
Der String-Wert war ein Beispiel. Ich brauchte ihn wirklich für einen Enum-Wert, bei dem ein leerer String nur einen Konvertierungsfehler verursacht. Mit dem @null können Sie eine Null als "no Enum set" haben, was ich brauche.
Kevin Schmidt
Umso mehr würde ich nicht null empfehlen, sondern eine Aufzählung, die nicht gesetzt darstellt.
Adam Gent
2
Das würde erfordern, Enum.NOTSET in alle Eigenschaftendateien (> 30) zu setzen, was eine Menge Arbeit mit fast keinen Vorteilen zu sein scheint ...
Kevin Schmidt
Ich habe das nicht versucht, aber theoretisch würde es nicht @Value("${stuff.value:NOTSET}")funktionieren?
Adam Gent
Ja, das ist eine gute Lösung. Leider kann ich die Aufzählung (dep) nicht ändern, daher muss ich mit null gehen. Andernfalls haben Sie Recht, das NOTSET würde funktionieren.
Kevin Schmidt
0

Wenn Sie eine leere Zeichenfolge (Länge 0) als Standardwert für @Value einfügen müssen, verwenden Sie SPEL (Spring Expression Language) wie folgt:

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

# {''} gibt Ihnen nur eine leere Zeichenfolge als Standardwert für injizierten @ Wert.

von yl

ylev
quelle