Wie wird ein Standardwert in der Spring @Value-Anmerkung korrekt angegeben?

Lesezeit: 4 Minuten

Benutzeravatar von Alex
Alex

Zunächst habe ich folgende Spezifikation:

@Value("#{props.isFPL}")
private boolean isFPL=false;

Dies funktioniert gut, wenn der Wert korrekt aus der Eigenschaftendatei abgerufen wird:

isFPL = true

Der folgende Ausdruck mit Standard führt jedoch zu dem Fehler:

@Value("#{props.isFPL:false}")
private boolean isFPL=false;

Ausdrucksanalyse fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.expression.spel.SpelParseException: EL1041E:(pos 28): Nach dem Parsen eines gültigen Ausdrucks enthält der Ausdruck noch mehr Daten: ‘Doppelpunkt(:)’

Ich habe auch versucht, $ anstelle von # zu verwenden.

@Value("${props.isFPL:true}")
private boolean isFPL=false;

Dann funktioniert der Standardwert in der Anmerkung einwandfrei, aber ich habe nicht den richtigen Wert aus der Eigenschaftendatei erhalten:

  • Mit #{} es ist ein Ausdruck, mit ${} es ist ein Platzhalter für einen Wert. Der erste Ausdruck, den Sie verwenden, ruft eine Methode/ein Attribut für eine Bean namens props auf, der Ausdruck mit dem Platzhalter versucht, eine Eigenschaft namens zu finden props.isFPL im Environment. Sie sollten letzteres verwenden und laden Ihre Eigenschaften wahrscheinlich falsch.

    – M.Deinum

    13. November 2014 um 19:18 Uhr

  • Danke schön. Wenn ich Eigenschaften falsch lade, warum nimmt #{} den richtigen Wert auf?

    – Alex

    13. November 2014 um 19:22 Uhr


  • Denn das ist ein Ausdruck, kein Platzhalter. Beide werden völlig unterschiedlich bewertet.

    – M.Deinum

    13. November 2014 um 19:36 Uhr

Benutzeravatar von shi9
shi9

Versuche es mit $ folgendermaßen:

@Value("${props.isFPL:true}")
private boolean isFPL=false;

Stellen Sie außerdem sicher, dass Sie die ignore-resource-no-found Zu WAHR so dass, wenn die Eigenschaftsdatei fehlt, die Standard Wert genommen wird.

Fügen Sie Folgendes in die Kontextdatei ein, wenn Sie eine XML-basierte Konfiguration verwenden:

<context:property-placeholder ignore-resource-not-found="true"/>

Bei Verwendung von Java-Konfigurationen:

 @Bean
 public static PropertySourcesPlaceholderConfigurer   propertySourcesPlaceholderConfigurer() {
     PropertySourcesPlaceholderConfigurer p =  new PropertySourcesPlaceholderConfigurer();
     p.setIgnoreResourceNotFound(true);

    return p;
 }

  • Mein Problem mit $ besteht nicht darin, einen Standardwert zu ignorieren. Das Problem besteht darin, dass der Wert aus der Eigenschaftendatei ignoriert wird

    – Alex

    15. November 2014 um 20:24 Uhr

  • Wie lädst du die Properties-Datei?

    – shi9

    17. November 2014 um 16:09 Uhr

Benutzeravatar von Kevin Liu
Kevin Liu

Für int Typvariable:

@Value("${my.int.config: #{100}}")
int myIntConfig;

Notiz: da ist kein Platz Vor der Doppelpunkt, sondern ein zusätzliches Leerzeichen nach der Doppelpunkt.

  • Ich glaube nicht, dass der zusätzliche Platz (nach dem Doppelpunkt) benötigt wird.

    – Schattenmann

    25. Juli 2018 um 21:52 Uhr

  • Scheint eine alte Antwort zu sein. Ich konnte den int-Wert wie jeden anderen Wert zuordnen. @Value("${my.int.config:100}")

    – Manisch Bansal

    1. Oktober 2021 um 14:00 Uhr

Benutzeravatar von Majid Roustaei
Majid Roustaei

Die genaue Antwort auf Ihre Frage hängt davon ab Typ des Parameters.

für ‘String’-Parameter funktioniert Ihr Beispielcode gut:

@Value("#{props.string.fpl:test}")
private String fpl = "test";

für andere Typen (wie boolean in Ihrer Frage) sollte es so geschrieben werden:

@Value("${props.boolean.isFPL:#{false}}")
private boolean isFPL = false;

oder für ‘Ganzzahlen’:

@Value("${props.integer.fpl:#{20}}")

Enthält Ihre Spring-Anwendungskontextdatei mehr als eine PropertyPlaceholder-Bean wie unten:

<context:property-placeholder ignore-resource-not-found="true" ignore-unresolvable="true" location="classpath*:/*.local.properties" />
<context:property-placeholder location="classpath:/config.properties" />

Wenn ja, dann Eigenschaftssuche nach: props.isFPL findet nur für die erste Eigenschaftsdatei statt (.lokale.Eigenschaften), wenn die Eigenschaft nicht gefunden wird, der Standardwert (WAHR) wird wirksam und die zweite Eigenschaftsdatei (config.properties) wird für diese Eigenschaft effektiv ignoriert.

Für einen String können Sie standardmäßig null wie folgt verwenden:

public UrlTester(@Value("${testUrl:}") String url) {
    this.url = url;
}

  • Unter Wartungsgesichtspunkten würde ich lieber sehen @Value("${testUrl:#{null}}").

    – Betliste

    23. Januar 2020 um 2:36 Uhr

  • Das scheint falsch zu sein. Für eine Zeichenfolge ${var:} ist standardmäßig ein leerer String ""

    – Peter Wippermann

    11. Januar 2022 um 15:09 Uhr


Benutzeravatar von Mike Summers
Mike Sommer

Hängt davon ab, wie Sie Ihre Eigenschaften laden, wenn Sie etwas wie verwenden

<context:property-placeholder location="classpath*:META-INF/spring/*.properties" />

Dann @Value Sollte aussehen, wie

@Value("${isFPL:true}")

  • Unter Wartungsgesichtspunkten würde ich lieber sehen @Value("${testUrl:#{null}}").

    – Betliste

    23. Januar 2020 um 2:36 Uhr

  • Das scheint falsch zu sein. Für eine Zeichenfolge ${var:} ist standardmäßig ein leerer String ""

    – Peter Wippermann

    11. Januar 2022 um 15:09 Uhr


Benutzeravatar von Kislay Verma
Kilay Verma

Diese Art der Definition von Standardwerten funktioniert nur, wenn wir “value=…” in die @Value-Annotation schreiben. z.B

Funktioniert nicht : @Value(“${testUrl:some-url}” // Dies setzt immer “some-url”, egal was Sie in der Konfigurationsdatei tun.

Funktioniert : @Value(value = “${testUrl:some-url}” // Dadurch wird “some-url” nur gesetzt, wenn die testUrl-Eigenschaft in der Konfigurationsdatei fehlt.

1449690cookie-checkWie wird ein Standardwert in der Spring @Value-Anmerkung korrekt angegeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy