Jak zdefiniować @Value jako opcjonalne

119

W fasoli wiosennej mam następujące elementy:

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

Wartość jest prawidłowo wprowadzona. Jednak zmienna musi być opcjonalna, jest przekazywana jako parametr wiersza poleceń (który jest następnie dodawany do kontekstu Spring za pomocą elementu SimpleCommandLinePropertySource ), a ten argument nie zawsze będzie istniał.

W celu podania wartości domyślnej wypróbowałem oba poniższe sposoby:

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

ale w każdym przypadku domyślny argument po dwukropku jest wstawiany, nawet jeśli istnieje rzeczywista wartość - wydaje się, że zastępuje to, co powinien wstrzyknąć Spring.

Jaki jest prawidłowy sposób określenia, że @Value nie jest wymagane?

Dzięki

user1052610
źródło
To bardzo dziwne… wartość domyślna powinna działać tylko jako wartość domyślna (tj. Gdy właściwość nie jest zdefiniowana). Czy możesz dwukrotnie sprawdzić swoje stwierdzenie „wartość domyślna jest wprowadzana nawet wtedy, gdy istnieje rzeczywista wartość” (np. Jeśli nie ma starej skompilowanej klasy)?
Pavel Horal
7
@Value("${some.prop:}")działa dla mnie. To jedyna adnotacja dotycząca tej zmiennej.
Zaratustra
Czy możesz opublikować konfigurację aplikacji?
Vladimir Vagaytsev
@Autowired (required = false)?
Andrew Scott Evans

Odpowiedzi:

179

Jaki jest prawidłowy sposób określenia, że ​​@Value nie jest wymagane?

Wychodząc z założenia, że ​​przez „nie wymagane” masz na myśli null...

Poprawnie zauważyłeś, że możesz podać domyślną wartość po prawej stronie :znaku. Twój przykład był @Value("${myValue:DEFAULT}").

Nie jesteś ograniczony do zwykłych ciągów znaków jako wartości domyślnych. Możesz używać wyrażeń SPEL , a proste wyrażenie SPEL do zwrócenia nullto:

@Value("${myValue:#{null}}")
Andy Brown
źródło
49

Jeśli używasz Java 8, możesz skorzystać z jej java.util.Optionalklasy. Wystarczy zadeklarować zmienną w następujący sposób:

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

Następnie możesz sprawdzić, czy wartość jest zdefiniowana w ładniejszy sposób:

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

Mam nadzieję, że to pomoże!

alonso_50
źródło
4
Zgodnie z pomysłem intelliJ. Używanie Optionaltypów w polach klas nie jest najlepszą praktyką .
Fırat KÜÇÜK
2
Robisz to i wyrzuca NPE. valuejest null.
aatk
1
@aatk Wygląda na to, że opisywany przez Ciebie problem został naprawiony co najmniej od 4.3.13. Nie mam problemu z użyciem opisanej deklaracji. Chociaż lepiej jest po prostu użyć wartości zerowej
Torben
2
„Zgodnie z pomysłem intelliJ. Stosowanie typów opcjonalnych w polach klas nie jest najlepszą praktyką”. co jest złego w używaniu opcjonalnej jako zmiennej instancji? tylko, że jest stosunkowo długi czas w porównaniu do użycia w getterach ... i takie pole powinno być oznaczone Transient do serializacji?
Andrey M. Stepanov