Spring 3表达式语言如何与属性占位符交互?

Spring 3引入了一种新的表达语言(SpEL),可以在bean定义中使用。语法本身已经很好地指定了。

目前还不清楚SpEL如何与以前版本中已经存在的属性占位符语法进行交互。SpEL是否支持属性占位符,还是我必须结合两种机制的语法并希望它们结合起来?

让我举一个具体的例子。我想使用属性语法${x.y.z},但要加上elvis运算符提供的“默认值”语法,以处理${x.y.z}未定义的情况。

我尝试了以下语法,但没有成功:

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

第一个给我

在类型为“ org.springframework.beans.factory.config.BeanExpressionContext”的对象上找不到字段或属性“ x”

这表明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"));

}

}

挑战-在bean文件中提供SpEL表达式,允许我在${x.y.z}无法解析的情况下指定默认值,并且必须将默认值指定为表达式的一部分,而不是在另一个属性集中外部化。

回答:

要从SpEL表达式访问属性占位符,可以使用以下语法:#{'${x.y.z}'}。但是,用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>

以上是 Spring 3表达式语言如何与属性占位符交互? 的全部内容, 来源链接: utcz.com/qa/407537.html

回到顶部