gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:02:39 31 4
gpt4 key购买 nike

Spring 3 引入了一个新的 expression language (SpEL) 可以在 bean 定义中使用。语法本身是相当明确的。

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

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

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

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

第一个给我

Field or property 'x' cannot be found on object of type 'org.springframework.beans.factory.config.BeanExpressionContext'

这表明 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>

关于java - Spring 3 表达式语言如何与属性占位符交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2041558/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com