Как язык Spring 3 выражения взаимодействует с заполнителями свойства?

Spring 3 представил новый язык выражения (SpEL), который может использоваться в бобовых определениях. Сам синтаксис довольно хорошо указан.

То, что не ясно, - то, как, если вообще, SpEL взаимодействует с синтаксисом заполнителя свойства, который уже присутствовал в предыдущих версиях. SpEL имеет поддержку заполнителей свойства, или я должен объединить синтаксис обоих механизмов и надеяться, что они объединяются?

Позвольте мне дать конкретный пример. Я хочу использовать синтаксис свойства ${x.y.z}, но с добавлением синтаксиса "значения по умолчанию" в соответствии с elvis оператором для обработки случаев, где ${x.y.z} не определено.

Я попробовал следующие синтаксисы без успеха:

  • #{x.y.z?:'defaultValue'}
  • #{${x.y.z}?:'defaultValue'}

Первый дает мне

Поле или свойство 'x' не могут быть найдены на объекте типа 'org.springframework.beans.factory.config. BeanExpressionContext'

который предполагает, что SpEL не распознает это как заполнителя свойства.

Второй синтаксис выдает исключение, говоря, что заполнитель не распознан, таким образом, сопоставитель заполнителя вызывается, но перестал работать как ожидалось, так как свойство не определяется.

Документы не упоминают об этом взаимодействии, таким образом, или такая вещь не возможна, или это не документировано.

Кому-либо удалось сделать это?


Хорошо, я придумал небольшой, автономный тестовый сценарий для этого. Это все работы как есть:

Во-первых, бобовые определения:



 

    

    
        Value A
    

    
            
         

             
         

Затем тривиальный класс компонента:

тест пакета;

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 в бобовом файле, который позволяет мне указывать значение по умолчанию в случаях где ${x.y.z} не может быть разрешен, и это значение по умолчанию должно быть указано как часть выражения, не воплощенного в другом наборе свойств.

53
задан Richard Wiseman 5 January 2015 в 03:24
поделиться

2 ответа

Для доступа к заполнению недвижимости от экспрессии SPEL можно использовать следующий синтаксис: # {'$ {x.y.z}'} . Hovewer, он не может решить вашу проблему с оператором ELVIS и значениями по умолчанию, потому что он будет выбросить исключение, когда $ {x.y.z} не может быть разрешено.

Но вам не нужно SPEL, чтобы объявить значения по умолчанию для свойств:

<context:property-placeholder location="..." properties-ref="defaultValues"/>

<bean id = "defaultValues" class = "org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="x.y.z">ZZZ</prop>
        </props>
    </property>
</bean>

<bean ...>
    <property name = "..." value = "${x.y.z}" />
</bean>
27
ответ дан 7 November 2019 в 08:50
поделиться

Кажется, вы пропустили толстую кишку:

#{ ${x.y.z} ?: 'defaultValue' }
11
ответ дан 7 November 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: