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

2024-02-28

Spring 3 引入了新的表达语言 http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/expressions.html(SpEL) 可以在 bean 定义中使用。语法本身是相当明确的。

目前尚不清楚的是,SpEL 如何与先前版本中已存在的属性占位符语法进行交互(如果有的话)。 SpEL 是否支持属性占位符,或者我是否必须结合两种机制的语法并希望它们结合?

让我举一个具体的例子。我想使用属性语法${x.y.z},但添加了“默认值”语法,如埃尔维斯操作员 http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/expressions.html#d0e12053处理以下情况${x.y.z}未定义。

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

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

第一个给了我

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

这表明 SpEL 不会将其识别为属性占位符。

第二种语法抛出异常,表示无法识别占位符,因此占位符解析器is被调用,但由于未定义该属性而按预期失败。

文档没有提到这种交互,所以这样的事情要么是不可能的,要么是没有记录的。

有人设法做到这一点吗?


好的,我为此想出了一个小型的、独立的测试用例。这一切都按原样工作:

首先,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"));
    }
}

挑战 - 在 beans 文件中提出一个 SpEL 表达式,它允许我在以下情况下指定默认值:${x.y.z}无法解决,这个默认must被指定为表达式的一部分,而不是在另一个属性集中具体化。


要从 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 3 表达式语言如何与属性占位符交互? 的相关文章

随机推荐