Spring 3 представил новый язык выражений (SpEL), который можно использовать в определениях бинов. Сам синтаксис довольно хорошо указан.
Что не ясно, так это то, как, если вообще, SpEL взаимодействует с синтаксисом заполнителя свойства, который уже присутствовал в предыдущих версиях. Есть ли в SpEL поддержка заполнителей свойств или мне нужно объединить синтаксис обоих механизмов и надеяться, что они объединятся?
Позвольте мне привести конкретный пример. Я хочу использовать синтаксис свойства ${x.y.z}
, но с добавлением синтаксиса «значение по умолчанию», как это предусмотрено оператором elvis *1009*, для обработки случаев, когда ${x.y.z}
не определено.
Я пробовал следующие синтаксисы без успеха:
#{x.y.z?:'defaultValue'}
#{${x.y.z}?:'defaultValue'}
Первый дает мне
Поле или свойство 'x' не найдено
на объекте типа
'Org.springframework.beans.factory.config.BeanExpressionContext'
, что говорит о том, что SpEL не распознает это как заполнитель свойства.
Второй синтаксис генерирует исключение, говорящее о том, что заполнитель не распознан, поэтому распознаватель заполнителя вызывается , но происходит сбой, как и ожидалось, поскольку свойство не определено.
В документах не упоминается об этом взаимодействии, поэтому либо такая вещь невозможна, либо она недокументирована.
Кому-нибудь удалось это сделать?
ОК, я придумал небольшой автономный тестовый пример для этого. Это все работает как есть:
Сначала определения бинов:
<?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>
Затем тривиальный класс бобов:
пакетный тест;
public class Bean {
String value;
public void setValue(String value) {
this.value = value;
}
}
И, наконец, контрольный пример:
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"));
}
}
Задача - найти в файле beans выражение SpEL, которое позволяет мне указать значение по умолчанию в случаях, когда ${x.y.z}
не может быть разрешено, и это значение по умолчанию должно быть указано как часть выражение, не экстернализованное в другом наборе свойств.