我有一个像这样的过滤配置(使用Maven进行过滤):
<bean class="com.whatever.SomeClass">
<property name="someString" value="${filter.prop.value}"/>
</bean>
有时候字符串属性需要为null(由于我不会进入这里),所以我需要一种方法将属性指定为null。显然,如果我使用属性文件值“null”进行过滤,则bean属性将为String“null”而不是实际为null。
我知道我可以创建类似NullableStringFactoryBean的东西,它可以查找字符串“null”并适当地处理它。
我的问题是:Spring是否提供了一种机制来实现这一点,还是有更好的方法来实现这一目标?
答案 0 :(得分:2)
查看setNullValue
课程中的PropertyPlaceholderConfigurer
方法,看看它是否对您的情况有所帮助。
设置一个值,当作为占位符值解析时应该被视为null:例如“”(空字符串)或“空”。
编辑:由于您正在使用Maven过滤,并且不希望有两种机制(一种由Maven在流程资源阶段完成,后来在运行时由Spring完成)只看到三个选项:
1)使用@Tomasz Nurkiewicz在其答案中指定的“智能”设置器。这可能有副作用,但正如你也提到的那样,并且可能变得“为了自己的利益而聪明”。
2)使用FactoryBean<String>
注入属性的值,如您在问题中添加的答案中所示(使用Spring的“p-namespace”是一种很好的方式限制你必须编写的XML数量来实现这一目标。)
3)(疯狂的想法)替换XML中的整个属性注入。也就是说,而不是这个:
<bean class="com.whatever.SomeClass">
<property name="someString" value="${filter.prop.value}"/>
</bean>
有这个:
<bean class="com.whatever.SomeClass">
${filter.prop.value}
</bean>
现在,filter.prop.value
代替null
或someValidValue
可以成为一些空白区域
分别为<property name="someString" value="someValidValue"/>
。
这样做的缺点是IDE会抱怨XML无效(因为<bean>
标记不允许使用字符子元素,只允许使用元素)。但如果你能忍受那个......
我个人会选择第二名。
答案 1 :(得分:0)
怎么样:
public void setSomeString(String value) {
if(value == null || value.equals("") || value.equals("null")) {
this.value = null;
} else {
this.value = value;
}
}
答案 2 :(得分:0)
好吧,如果有人想知道如何使用FactoryBean完成...
public class NullLiteralResolvingStringFactoryBean implements
FactoryBean<String> {
private String value;
@Override
public String getObject() throws Exception {
if (value == null || value.equals("null")) {
return null;
}
return value;
}
@Override
public Class<?> getObjectType() {
return String.class;
}
@Override
public boolean isSingleton() {
return true;
}
public void setValue(String value) {
this.value = value;
}
}
配置:
<bean id="someString" class="com.whatever.NullLiteralResolvingStringFactoryBean"
p:value="${filter.someString}" />