Я столкнулся с этим исключением при создании bean-источника данных из DBCP2. Исключение составляетСоздание весеннего боба. Может ли тип параметра установщика быть родителем возвращаемого типа получателя?
Вызванный: org.springframework.beans.NotWritablePropertyException: Invalid свойство «connectionInitSqls» класса боба [org.apache.commons.dbcp2.BasicDataSource]: Бобовые собственности «connectionInitSqls» не доступен для записи или имеет неверный метод setter. Соответствует ли тип параметра сеттера типу возврата получателя?
вот моя конфигурация боб
<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>
Вот и присваивателя код connectionInitSqls в классе BasicDataSource. версия 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;
}
}
Вы можете видеть, что аргумент в инкубаторе является коллекцией, которая является супер типа списка. Но я не знаю, почему весна не могла создать экземпляр компонента. Это проблема Spring или ошибка в коде DBCP2. Можем ли мы предоставить родительский тип свойства в аргументе setter? Как решить эту проблему? Любая помощь будет оценена по достоинству.
Ваше Объяснение немного запутанно! Тип параметра в setConnectionInitSqls - это Collection, который является Parrent Interface of List. Разве Spring это не позволяет? тип параметра Должен быть равен типу свойства? – Mubasher
Но коллекция может быть установлена или любой другой тип. Скажем, если Spring принял Collection, и мы передаем тип набора, это означает, что набор может быть присвоен типу списка, который является абсурдным. Помните, что это метод сеттера, а не только любой другой метод. см. весна использует отражение. Теперь он знает имя метода и типа свойства, которое является списком. Поэтому он попытается найти метод путем отражения с этими параметрами. Почему весна попробует его базовые типы. –
Этот код из Apache Commons DBCP2 Library version 2.1, IMO Основной причиной этого установщика является предоставление свободы любого типа коллекции, либо списка, либо набора. Почему разработчики Apache не думают об этой проблеме, потому что в основном в legecy-приложениях мы все еще используем базовую конфигурацию xml для весны для определения dataSoure. Есть предположения? Должен ли я отмечать это как ошибку в DBCP2 Jira? – Mubasher