Używamy PropertyPlaceholderConfigurer do używania właściwości java w naszej konfiguracji Spring ( szczegóły tutaj )
na przykład:
<foo name="port">
<value>${my.server.port}</value>
</foo>
Chcielibyśmy dodać dodatkową właściwość, ale mamy system rozproszony, w którym wszystkie istniejące instancje mogłyby używać wartości domyślnej. Czy istnieje sposób, aby uniknąć aktualizowania wszystkich naszych plików właściwości, wskazując domyślną wartość w konfiguracji Spring, gdy nie ma zdefiniowanej zastępującej wartości właściwości?
źródło
18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA
jest? Jestem pewien, że wszyscy inni wiedzą i jestem po prostu głupi, ale na wszelki wypadek ...Spring 3 obsługuje
${my.server.port:defaultValue}
składnię.źródło
${my.server.port:-defaultValue}
daje ten sam wynik, zwróć uwagę na „:-
” w przeciwieństwie do „:
”.<context:property-placeholder/>
aby to zadziałało, lub dodaćPropertyPlaceholderConfigurer
Jest mało znana funkcja, która czyni to jeszcze lepszym. Możesz użyć konfigurowalnej wartości domyślnej zamiast wartości zakodowanej na stałe, oto przykład:
config.properties:
timeout.default=30 timeout.myBean=60
context.xml:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>config.properties</value> </property> </bean> <bean id="myBean" class="Test"> <property name="timeout" value="${timeout.myBean:${timeout.default}}" /> </bean>
Aby użyć wartości domyślnej, jednocześnie mając możliwość łatwego zastąpienia później, zrób to w config.properties:
timeout.myBean = ${timeout.default}
źródło
${timeout.myBean:${timeout.default}}
. Dzięki temu moja domyślna również była zmienną.<foo name="port"> <value>${my.server.port:8088}</value> </foo>
powinien działać, aby mieć port 8088 jako domyślny
Zobacz też: http://blog.callistaenterprise.se/2011/11/17/configure-your-spring-web-application/
źródło
Wartość domyślna może być zakończona znakiem
:
właściwości, np<property name="port" value="${my.server.port:8080}" />
Lub w kodzie java:
@Value("${my.server.port:8080}") private String myServerPort;
Widzieć:
valueSeparator
(odAbstractPropertyResolver
)i
VALUE_SEPARATOR
(odSystemPropertyUtils
)BTW, Elvis Operator jest dostępny tylko w języku Spring Expression Language (SpEL),
np .: https://stackoverflow.com/a/37706167/537554
źródło
http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html wskazuje, że „właściwości lokalne” zdefiniowane w samym ziarnie będą uważane za domyślne i nadpisane przez wartości odczytywane z plików:
<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"><value>my_config.properties</value></property> <property name="properties"> <props> <prop key="entry.1">123</prop> </props> </property> </bean>
źródło
Znajduję również inne rozwiązanie, które działa dla mnie. W naszym starszym projekcie wiosennym używamy tej metody, aby dać naszym użytkownikom możliwość korzystania z tych własnych konfiguracji:
<bean id="appUserProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="ignoreResourceNotFound" value="false"/> <property name="locations"> <list> <value>file:./conf/user.properties</value> </list> </property> </bean>
A w naszym kodzie, aby uzyskać dostęp do tych właściwości, należy napisać coś takiego:
@Value("#{appUserProperties.userProperty}") private String userProperty
A jeśli pojawi się sytuacja, kiedy musisz dodać nową właściwość, ale w tej chwili nie chcesz jej dodawać w konfiguracji użytkownika produkcyjnego, bardzo szybko staje się piekłem, gdy musisz załatać wszystkie konteksty testowe lub aplikacja zakończy się niepowodzeniem uruchomienie.
Aby poradzić sobie z tym problemem, możesz użyć następnej składni, aby dodać wartość domyślną:
@Value("#{appUserProperties.get('userProperty')?:'default value'}") private String userProperty
To było dla mnie prawdziwe odkrycie.
źródło