当前位置: 首页 > 面试题库 >

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

董联
2023-03-14
问题内容

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-Boot中向application.properties文件中注入值。外部属性添加到logging.file变量中。我有一个application.properties文件,看起来如下所示 具有相应的Spring-boot应用程序类 请注意,如果我自己注入服务器端口号,那么在注入和启动应用程序时没有任何问题。 我在这个问题上兜圈子,弄不清自己做错了什么。

  • 我不熟悉Camel,并且在JavaDSL中使用简单表达式从属性文件中获取值。 <代码>。setProperty(“PortalUrl”,简单(“properties:Portal.url”)) 属性文件值-门户。url=abc。com/示例 但是现在我需要从属性文件中获取客户特定的URL。示例值- <代码>门户。url。客户1=abc。com/example/xiang门户。url。客户2=abc

  • 问题内容: 有谁知道我是否应该可以在预选赛中使用属性占位符作为表达式?我似乎无法正常工作。 我正在使用Spring 3.0.4。 XML: config.properties: 问题答案: 这可行。如果仅使用默认的spring bean名称,则可以省略服务名称。serviceA与ServiceA等 XML: Props:

  • #{}速度快,能防止sql注入,是占位符方式,先预编译,然后填充参数,字符串格式,用户名=(___),参数只是下划线上的内容 ${}是直接拼接到语句上,这种方式需要自己拼括号和参数,但是也可以拼接想执行的任何语句,也就是传说中的sql注入 详情如下 在MyBatis中使用参数进行SQL拼装经常会使用到#{var}和${var}两种参数的设置方式。下面是两种方式的不用之处: #{var} 使用预编译

  • JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。 一个简单的语法 典型的,当您需要在JSP标签中指定一个属性值时,只需要简单地使用字符串即可: <jsp:setProperty name="box" propert

  • 问题内容: 我有一个小问题,IE 8-9不支持输入框的属性。 在我的项目(ASP Net)中获得这种支持的最佳方法是什么。我正在使用jQuery。我需要使用其他一些外部工具吗? 问题答案: 在$ .Browser.msie是不是最新的JQuery了…你必须使用$。支持 如下所示: