2014-11-13 16 views
15

Początkowo, mam następujące specyfikację:Jak poprawnie określić wartość domyślną w adnotacji Spring @Value?

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

to działa prawidłowo prawidłowo uzyskanie wartości z pliku właściwość:

isFPL = true 

Jednak następujące wyrażenie z domyślnych powoduje błąd:

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

Parsowanie wyrażeń nie powiodło się; Zagnieżdżony wyjątek to org.springframework.expression.spel.SpelParseException: EL1041E: (pos 28): Po przeanalizowaniu poprawnego wyrażenia w wyrażeniu jest jeszcze więcej danych: 'dwukropek (:)'

Próbowałem również użyj $ zamiast #.

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

to wartość domyślna w adnotacji działa dobrze, ale nie dostać poprawną wartość z pliku properties:

+0

od '# {}' jest wyrazem, z '$ {}' to jest zastępczy dla wartości. Pierwsze używane wyrażenie wywoła metodę/atrybut na komponencie bean o nazwie rekwizyty, a ten z elementem zastępczym spróbuje zlokalizować właściwość o nazwie 'props.isFPL' w' Środowisku'. Powinieneś użyć tego ostatniego i prawdopodobnie ładujesz swoje nieruchomości w niewłaściwy sposób. –

+0

Dziękuję. Jeśli ładuję właściwości w niewłaściwy sposób, dlaczego # {} podnosi poprawną wartość? –

+0

Ponieważ jest to wyrażenie, które nie jest symbolem zastępczym. Oba są oceniane na zupełnie różne sposoby. –

Odpowiedz

17

spróbuj $ następująco

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

również upewnić się ustawić ignore-resource-no-found to true, więc jeśli brakuje pliku właściwości, zostanie przyjęta wartość domyślna.

również umieścić następujące in -

plik kontekst przypadku korzystania konfigurację opartą xm:

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

w klasie konfiguracji W przypadku korzystania z konfiguracji Java:

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

    return p; 
} 
+1

Mój problem z $ nie ignoruje wartości domyślnej. Problem polega na tym, że wartość z pliku właściwości jest ignorowana. –

+0

Jak ładujesz plik właściwości? – shi9

1

zależy ładujesz swoje właściwości, jeśli używasz czegoś takiego jak

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

Następnie @Value powinien wyglądać

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

Czy Twój plik kontekst aplikacji Wiosna zawiera więcej niż jeden fasola propertyPlaceholder jak poniżej:

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

Jeśli tak, to wyszukiwanie nieruchomości dla: rekwizytów. isFPL będzie miało miejsce tylko dla pierwszego pliku właściwości (.local.properties), jeśli właściwość nie zostanie znaleziona, wartość domyślna (true) zostanie zastosowany, a drugi plik właściwości (config.properties) zostanie skutecznie zignorowany dla tej właściwości.

2

Dla zmiennej int typu:

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

Uwaga: nie ma miejsca przed okrężnicy, ale dodatkowa przestrzeń po okrężnicy.

1

ciągu znaków można wywiązać null tak:

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