W jaki sposób język ekspresji Spring 3 współdziała z symbolami zastępczymi właściwości?
Wiosna 3 wprowadziła nowyjęzyk wyrażenia (SpEL), które można stosować w definicjach fasoli. Sama składnia jest dość dobrze określona.
Nie jest jasne, w jaki sposób SpEL współdziała z składnią zastępczą właściwości, która była już obecna we wcześniejszych wersjach. Czy SpEL ma wsparcie dla symboli zastępczych właściwości, czy też muszę połączyć składnię obu mechanizmów i mam nadzieję, że się połączą?
Podam konkretny przykład. Chcę użyć składni właściwości${x.y.z}
, ale z dodaniem składni „wartości domyślnej” dostarczonej przezoperator Elvisa do obsługi spraw gdzie${x.y.z}
jest niezdefiniowane.
Bez powodzenia wypróbowałem następującą składnię:
#{x.y.z?:'defaultValue'}
#{${x.y.z}?:'defaultValue'}
Pierwszy daje mi
Pola lub właściwości „x” nie można znaleźć na obiekcie typu „org.springframework.beans.factory.config.BeanExpressionContext”
co sugeruje, że SpEL nie rozpoznaje tego jako symbolu zastępczego właściwości.
Druga składnia zgłasza wyjątek mówiący, że symbol zastępczy nie jest rozpoznawany, więc tłumacz zastępczyjest wywoływany, ale nie działa zgodnie z oczekiwaniami, ponieważ właściwość nie jest zdefiniowana.
Doktorzy nie wspominają o tej interakcji, więc albo coś takiego nie jest możliwe, albo jest nieudokumentowane.
Ktoś to zrobił?
OK, wymyśliłem mały, samodzielny futerał testowy do tego. To wszystko działa tak jak jest:
Po pierwsze, definicje fasoli:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
">
<context:property-placeholder properties-ref="myProps"/>
<util:properties id="myProps">
<prop key="x.y.z">Value A</prop>
</util:properties>
<bean id="testBean" class="test.Bean">
<!-- here is where the magic is required -->
<property name="value" value="${x.y.z}"/>
<!-- I want something like this
<property name="value" value="${a.b.c}?:'Value B'"/>
-->
</bean>
</beans>
Następnie trywialna klasa fasoli:
test pakietu;
public class Bean {
String value;
public void setValue(String value) {
this.value = value;
}
}
I wreszcie sprawa testowa:
package test;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class PlaceholderTest {
private @Resource Bean testBean;
@Test
public void valueCheck() {
assertThat(testBean.value, is("Value A"));
}
}
Wyzwanie - wymyślić wyrażenie SpEL w pliku bean, które pozwala mi określić wartość domyślną w przypadkach, w których${x.y.z}
nie można rozwiązać, a to ustawienie domyślnemusi być określone jako część wyrażenia, a nie zewnętrznie w innym zestawie właściwości.