涉及多个bean的SpEL表达式

问题描述 投票:0回答:1

bean 的定义如下:

   <bean id="defaultSourceMetaData" class="com.example.metadata.SourceMetaData">
        <constructor-arg type="java.lang.String" value="${source.name}"/>
   </bean>
   <bean id="reconSourceMetaData" class="com.example.metadata.SourceMetaData" factory-method="extractData">
        <constructor-arg index="0" value="${source.metadata.query}"/>
   </bean>
   <bean id="sourceProvider" class="com.example.file.FileSourceProvider">
        <property name="sourceMetaData" value="#{ reconSourceMetaData != null ? reconSourceMetaData : defaultSourceMetaData }"/>
   </bean>

我们知道,

reconSourceMetaData
为空——因为初始化它的查询返回一个空集。但是
defaultSourceMetaData
没有被创建——并且程序失败并显示

Cannot convert value of type 'org.springframework.beans.factory.support.NullBean' to required type 'com.example.metadata.SourceMetaData' for property 'sourceMetaData': no matching editors or conversion strategy found

如果我将 SpEL 表达式替换为对默认 bean 的直接引用:

<property name="sourceMetaData" ref="defaultSourceMetaData"/>

defaultSourceMetaData
-bean 已初始化,且属性已正确初始化。但我确实需要有条件的初始化——我使用的语法有什么问题?

java xml spring spring-el
1个回答
0
投票

感谢@m-deinum提供的提示,我明白了:使用

.equals
方法而不是与
null
进行比较。下面的表达式现在可以工作,就像之前的语法用于 Spring-4.x 一样:

#{reconSourceMetaData.equals(null) ? defaultSourceMetaData : reconSourceMetaData}
© www.soinside.com 2019 - 2024. All rights reserved.