在Spring中将默认属性值指定为NULL

38

我想在Spring XML配置文件中定义默认属性值。我希望这个默认值是null

就像这样:

...
<ctx:property-placeholder location="file://${configuration.location}" 
                          ignore-unresolvable="true" order="2" 
                          properties-ref="defaultConfiguration"/>

<util:properties id="defaultConfiguration">
    <prop key="email.username" >
        <null />
    </prop>  
    <prop key="email.password">
        <null />
    </prop>  
</util:properties>
...

这行不通。在Spring XML配置中定义null属性的默认值是否可能?


你回答了自己的问题。使用<null />。 - ooops
它不会这样工作:以“null”元素开头的无效内容。在此处不需要子元素。 - Ondrej Bozek
我不认为你可以这样做。也许删除这些属性就足够了。如果一个属性没有定义,Java Properties 会返回 null。 - soulcheck
如果属性文件中缺少某个属性且我没有定义默认值,则在尝试引用此缺失的属性时会出现问题:
无法解析字符串值中的占位符'email.username' "${email.username}"
- Ondrej Bozek
3
您可以使用${email.username:null}将null设置为默认值,但这可能会使您得到字符串"null"。或者,如果您正在使用@Value,您可以添加@Autowired(required = false),然后任何缺少的属性都将被设置为null。 - Tom McIntyre
我认为你不能将属性定义为null,并在XML中使用属性占位符。如果属性不存在,属性将返回null,并且如果您返回null,则这意味着Spring也会将其视为属性不存在。我认为这也与https://jira.springsource.org/browse/SPR-7294有关。 - YoK
4个回答

108

最好这样使用Spring EL

<property name="password" value="${email.password:#{null}}"/>

它检查email.password是否已指定,并将其设置为null(而不是"null"字符串)。


完美!这会引入对spring-el的依赖吗? - Justin Smith
2
太棒了!对于那些不知道的人,这也适用于Spring注释。@Value("${email.password:#{null}}") private String password; - wheeleruniverse

4
你可以尝试使用Spring EL。
<prop key="email.username">#{null}</prop>

这个不起作用。prop没有value属性。 我认为如果有解决方案,就必须使用除了prop之外的其他东西。 - Ondrej Bozek
你可以在标签之间放置EL,修改答案。 - YoK
4
这种方式会抛出NPE异常 Caused by: org.springframework.beans.factory.BeanCreationException: 创建名为'defaultConfiguration'的bean时出错:bean初始化失败;嵌套异常为java.lang.NullPointerException - Ondrej Bozek

4
请看PropertyPlaceholderConfigurer#setNullValue(String)
文档说明:
默认情况下,没有定义任何空值。这意味着除非显式映射相应的值,否则无法将null表示为属性值。
因此,只需在您的PropertyPlaceholderConfigurer中定义字符串“null”以映射null值即可。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="nullValue" value="null"/>
    <property name="location" value="testing.properties"/>
</bean>

现在您可以在属性文件中使用它:
db.connectionCustomizerClass=null
db.idleConnectionTestPeriod=21600

1
这也意味着您将不被允许使用字符串“null”。 - f.khantsis
1
老实说,谁会将显式的“null”字符串设置为null呢? - EpicPandaForce
Hibernate属性db.connectionCustomizerClass:我想要设置为com.mchange.v2.c3p0.example.InitSqlConnectionCustomizer或null。设置通过Maven过滤进行配置。 - Andrei Cojocaru

3

似乎你可以做以下事情:

@Value("${some.value:null}")
private String someValue;

并且

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfig() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setNullValue("null");
    return propertySourcesPlaceholderConfigurer;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接