如何让 SpEL (spring-el) 默认为在 Spring XML 中工作的空表达式?
How to get SpEL (spring-el) default to null expression working in the Spring XML?
期望的结果:
如果找不到 属性 键,或者值为空,默认为 null
。
我需要它可以为空或空白,以便在钱包和直接登录环境中工作。
问题:
我无法正确解析 SpEL default-to-null 表达式。
然而,根据文档,它应该适用于 Spring 3.0.
我怀疑我在 XML 或依赖项中遗漏了一些东西,但我终究无法弄清楚它是什么。
注:
SpEL 的替代方法是可以接受的,但我不想全局允许所有属性为空。 (不想设置ignoreUnresolvablePlaceholders=true
)
尝试的修复:
- 在 bean 定义中添加了
springframework.org/schema/context
。 无效果
- 尝试用
#
替换初始的 $
,但它只是作为文字字符串读取。 (
Spring 版本: 3.0.7.RELEASE
Java 版本: 1.6 (不要评判,不是我的选择)
异常:
2018-02-27 11:13:52,982 FATAL class BatchDriver 166 - Server(): Unexpected exception
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in class path resource [databaseContext.xml]: Could not resolve placeholder 'jdbc.credu:#{null'
at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:268)
at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:553)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:527)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:362)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
...
databaseContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="true">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" scope="singleton">
<property name="locations">
<list>
<value>classpath:/jdbc.properties</value>
<value>classpath:/javadriver.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username" value="${jdbc.credu:#{null}}"/>
<property name="password" value="${jdbc.credp:#{null}}"/>
~~~ Other Settings ~~~
</bean>
jdbc.properties:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:oci:/@WALLET_ALIAS
#jdbc.url=jdbc:oracle:thin:@255.255.255.255:9999/db_name
#jdbc.credu=username
#jdbc.credp=password
SpEL 在占位符之后解析;试试像
#{'${jdbc.credu:xxx}' == 'xxx' ? null : '${jdbc.credu:xxx}'}
编辑
3.0.7 是非常旧的版本; Spring 最高版本 4.3.x 与 java 6.
一起使用
这至少适用于 3.1。4.RELEASE:
<bean id="foo" class="com.example.Foo">
<property name="foo" value="#{'${foo:bar}' == 'bar' ? null : '${foo:bar}'}"/>
</bean>
和
public class So49013862Application {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("foo.xml");
System.out.println(ctx.getBean("foo"));
ctx.close();
}
}
和
null
Foo [foo=null]
和
public class Foo {
private String foo;
public void setFoo(String foo) {
System.out.println(foo);
this.foo = foo;
}
@Override
public String toString() {
return "Foo [foo=" + this.foo + "]";
}
}
我没有时间用 3.0.x 来测试它。
期望的结果:
如果找不到 属性 键,或者值为空,默认为 null
。
我需要它可以为空或空白,以便在钱包和直接登录环境中工作。
问题:
我无法正确解析 SpEL default-to-null 表达式。
然而,根据文档,它应该适用于 Spring 3.0.
我怀疑我在 XML 或依赖项中遗漏了一些东西,但我终究无法弄清楚它是什么。
注:
SpEL 的替代方法是可以接受的,但我不想全局允许所有属性为空。 (不想设置ignoreUnresolvablePlaceholders=true
)
尝试的修复:
- 在 bean 定义中添加了
springframework.org/schema/context
。 无效果 - 尝试用
#
替换初始的$
,但它只是作为文字字符串读取。 (
Spring 版本: 3.0.7.RELEASE
Java 版本: 1.6 (不要评判,不是我的选择)
异常:
2018-02-27 11:13:52,982 FATAL class BatchDriver 166 - Server(): Unexpected exception
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in class path resource [databaseContext.xml]: Could not resolve placeholder 'jdbc.credu:#{null'
at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:268)
at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:553)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:527)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:362)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
...
databaseContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-lazy-init="true">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" scope="singleton">
<property name="locations">
<list>
<value>classpath:/jdbc.properties</value>
<value>classpath:/javadriver.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username" value="${jdbc.credu:#{null}}"/>
<property name="password" value="${jdbc.credp:#{null}}"/>
~~~ Other Settings ~~~
</bean>
jdbc.properties:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:oci:/@WALLET_ALIAS
#jdbc.url=jdbc:oracle:thin:@255.255.255.255:9999/db_name
#jdbc.credu=username
#jdbc.credp=password
SpEL 在占位符之后解析;试试像
#{'${jdbc.credu:xxx}' == 'xxx' ? null : '${jdbc.credu:xxx}'}
编辑
3.0.7 是非常旧的版本; Spring 最高版本 4.3.x 与 java 6.
一起使用这至少适用于 3.1。4.RELEASE:
<bean id="foo" class="com.example.Foo">
<property name="foo" value="#{'${foo:bar}' == 'bar' ? null : '${foo:bar}'}"/>
</bean>
和
public class So49013862Application {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("foo.xml");
System.out.println(ctx.getBean("foo"));
ctx.close();
}
}
和
null
Foo [foo=null]
和
public class Foo {
private String foo;
public void setFoo(String foo) {
System.out.println(foo);
this.foo = foo;
}
@Override
public String toString() {
return "Foo [foo=" + this.foo + "]";
}
}
我没有时间用 3.0.x 来测试它。