我在从DBCP2创建数据源的bean时面临此异常。例外是Spring bean创建失败。可以将setter的参数类型作为getter的返回类型的父类型吗?
所致:org.springframework.beans.NotWritablePropertyException:bean类[org.apache.commons.dbcp2.BasicDataSource]的无效的属性 'connectionInitSqls':Bean属性 'connectionInitSqls' 不可写或具有无效的setter方法。 setter的参数类型是否与getter的返回类型相匹配?
这里是我的bean的配置
<bean id="fileStore_dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close" lazy-init="true">
<!-- Just that property which causes problem -->
<property name="connectionInitSqls">
<list>
<value>#{filestore.jdbc.connectionInitSql}</value>
</list>
</property>
</bean>
下面是对的BasicDataSource类connectionInitSqls setter和getter代码。 DBCP2的版本是2.1.1
private volatile List<String> connectionInitSqls;
public List<String> getConnectionInitSqls() {
final List<String> result = connectionInitSqls;
if (result == null) {
return Collections.emptyList();
}
return result;
}
public void setConnectionInitSqls(final Collection<String> connectionInitSqls) {
if (connectionInitSqls != null && connectionInitSqls.size() > 0) {
ArrayList<String> newVal = null;
for (final String s : connectionInitSqls) {
if (s != null && s.trim().length() > 0) {
if (newVal == null) {
newVal = new ArrayList<>();
}
newVal.add(s);
}
}
this.connectionInitSqls = newVal;
} else {
this.connectionInitSqls = null;
}
}
你可以看到二传手这样的说法是收集这是超级类型的List。但我不知道为什么春天不能实例化bean。 DBCP2代码中是Spring问题还是Bug?我们可以在setter参数中给父类型的属性吗? 我该如何解决这个问题?任何帮助,将不胜感激。
你的解释有点混乱! setConnectionInitSqls中的参数类型是List的Parrent接口的Collection。春天不是允许这个吗?是参数类型必须等于属性类型? – Mubasher
但可以设置集合或任何其他类型。说如果春天接受集合,并且我们正在传递一个集合类型,那么它意味着一个集合可以被分配给一个荒谬的列表类型。请记住,这不仅仅是其他任何方法的设置方法。看春天使用反射。现在它知道属性列表的方法名称和类型。所以它会尝试通过使用这些参数进行反射来找到方法。为什么要春天尝试它的基本类型。 –
此代码来自Apache Commons DBCP2 Library版本2.1,IMO基本原因在此setter背后的原因是给予任何集合类型的自由,无论是列表还是集合。为什么Apache开发人员不会考虑这个问题,因为大多数情况下,我们仍然使用Spring的xml基本配置来定义dataSoure。有什么想法吗?我应该将此标记为DBCP2 Jira中的错误吗? – Mubasher