Spring nullable String Bean

时间:2011-09-23 15:23:25

标签: spring configuration maven

我有一个像这样的过滤配置(使用Maven进行过滤):

<bean class="com.whatever.SomeClass">
    <property name="someString" value="${filter.prop.value}"/>
</bean>

有时候字符串属性需要为null(由于我不会进入这里),所以我需要一种方法将属性指定为null。显然,如果我使用属性文件值“null”进行过滤,则bean属性将为String“null”而不是实际为null。

我知道我可以创建类似NullableStringFactoryBean的东西,它可以查找字符串“null”并适当地处理它。

我的问题是:Spring是否提供了一种机制来实现这一点,还是有更好的方法来实现这一目标?

3 个答案:

答案 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代替nullsomeValidValue可以成为一些空白区域 分别为<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}" />