Spring 3 представил новый язык выражений (SpEL), который может использоваться в определениях bean. Сам синтаксис достаточно хорошо определен.
Не ясно, как, если вообще, SpEL взаимодействует с синтаксисом заполнителя свойства, который уже присутствовал в предыдущих версиях. Имеет ли SpEL поддержку заполнителей свойств, или мне нужно объединить синтаксис обоих механизмов и надеяться, что они объединятся?
Позвольте мне привести конкретный пример. Я хочу использовать синтаксис свойства ${x.y.z}, но с добавлением синтаксиса "по умолчанию", предоставленного оператором elis  для обработки случаев, когда ${x.y.z} - undefined.
Я пробовал следующие синтаксисы без успеха:
-  
#{x.y.z?:'defaultValue'} -  
#{${x.y.z}?:'defaultValue'} 
Первый дает мне
Поле или свойство 'x' не могут быть найдены на объект типа 'Org.springframework.beans.factory.config.BeanExpressionContext'
который предполагает, что SpEL не признает это как заполнитель свойств.
Второй синтаксис выдает исключение, говорящее, что местозаполнитель не распознается, поэтому вызывающий объект-заполнитель вызывается, но не работает должным образом, поскольку свойство не определено.
В документах не упоминается об этом взаимодействии, поэтому либо такая вещь невозможна, либо недокументирована.
Кому это удалось?
Хорошо, я придумал небольшой, автономный тестовый пример. Это все работает как есть:
Сначала определения bean:
<?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>
Тогда тривиальный класс bean:
пакетный тест;
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"));
    }
}
Задача - придумать выражение SpEL в файле beans, которое позволяет мне указать значение по умолчанию в случаях, когда ${x.y.z} не может быть разрешено, и это значение по умолчанию должно быть указано как часть выражения, а не экстернализируется в другом наборе свойств.