Могу ли я использовать заполнитель свойства с Spring EL?

Перед обновлением до Spring 3 в моем файле applicationContext.xml было следующее:

    <bean class="com.northgateis.pole.ws.PolePayloadValidatingInterceptor">
      <property name="validateRequest" value="${validateRequest}" />
      <property name="validateResponse" value="${validateResponse}" />
    </bean>

где ${validateRequest) и ${validateRequest) относятся к свойствам, которые могут быть определены или не определены в моем файле свойств.

В Spring 2, если эти свойства не присутствовали в файле свойств, установщики для компонента не вызывались, и поэтому использовались значения по умолчанию, жестко запрограммированные в PolePayloadValidatingInterceptor.

После обновления до Spring 3 поведение изменилось: если свойства отсутствуют в файле свойств, я получаю следующее исключение:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'annotationMapping' defined in class path resource [com/northgateis/pole/ws/applicationContext-ws.xml]: Could not resolve placeholder 'validateRequest'
 at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:272)
 at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75)
 at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:640)
 at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:615)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:405)
 at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:272)

Я пробовал баловаться с Spring EL, но, похоже, следующее не работает:

    <bean class="com.northgateis.pole.ws.PolePayloadValidatingInterceptor">
      <property name="validateRequest" value="${validateRequest?:true}" />
      <property name="validateResponse" value="${validateResponse?:false}" />
    </bean>

Значение после оператора Элвиса используется всегда, даже если свойства определены в файле свойств. Интересно, что синтаксис принят.

Какие-либо предложения?


person David Easley    schedule 16.06.2010    source источник


Ответы (2)


Похоже, что в Spring 3 обработка значений по умолчанию с помощью оператора Elvis была нарушена. По-видимому, это было исправлено (см. SPR-7209) в новой версии. the-oven Spring 3.0.3, и правильный синтаксис должен быть довольно причудливым:

#{${validateRequest}?:true}
person skaffman    schedule 16.06.2010
comment
Выглядит обнадеживающим. Это действительно работает, когда свойство имеет значение null (т. е. пусто в файле свойств), но приводит к тому же самому Не удалось разрешить заполнитель 'validateRequest' BeanDefinitionStoreException, если свойство отсутствует в файле свойств. Я попытаюсь снова открыть SPR-7209 и посмотреть, разрешит ли команда Spring считать отсутствующий эквивалент пустым. - person David Easley; 17.06.2010

Нет необходимости в Spring EL для установки значения по умолчанию для отсутствующего свойства при его разрешении с помощью конфигуратора-заполнителя. Просто используйте ${validateRequest:true}. «Оператор Элвиса» не занимается разрешением заполнителей, он просто полагается на любой ввод, который предоставляет конфигуратор заполнителей.

См. SPR-4785.

person Costi Ciudatu    schedule 23.06.2012