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.

questionAnswers(3)

yourAnswerToTheQuestion