Spring - Атрибут 'name' не может появляться в элементе 'constructor-arg'
Я использую hsqldb как db в своей программе. Я хочу ввести значения конструктора над spring.
Вот мой bean:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="ConnectionManager" class="at.tuwien.group2.vpm.persistence.ConnectionManager"
scope="singleton">
<constructor-arg name="url" value="jdbc:hsqldb:file:vpmDatabasetest" />
<constructor-arg name="user" value="sa" />
<constructor-arg name="password" value="" />
</bean>
Мой конструктор выглядит так:
public ConnectionManager(String url, String user, String password) {
if(url == null || user == null || password == null) {
throw new NullPointerException("Paramaeter cannot be null!");
}
this.url = url;
this.user = user;
this.password = password;
}
Однако, когда я хочу выполнить код, я получаю:
Атрибут 'name' не может появляться в элементе 'constructor-arg'
Атрибут 'name' не может появляться в элементе 'constructor-arg'
Что я должен использовать вместо этого?
Ответы
Ответ 1
Я предполагаю, что вы используете Sping 2.x. Используйте атрибут index, чтобы явно указать индекс аргументов конструктора:
<bean id="ConnectionManager" ...>
<constructor-arg index="0" value="jdbc:hsqldb:file:vpmDatabasetest" />
<constructor-arg index="1" value="sa" />
<constructor-arg index="2" value="" />
</bean>
Кроме того, с Spring 3.0 вы также можете использовать имя параметра конструктора для значения значений.
Ответ 2
У меня была такая же проблема с использованием библиотек Spring 3.1.2.
Моя ошибка заключалась в том, что я использовал старую схему.
Когда я изменился с
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
к
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"
он отлично работал, чтобы использовать named вместо индексированных конструкторов-аргументов.
Ответ 3
Просто удалите атрибут name
<bean id="ConnectionManager" class="at.tuwien.group2.vpm.persistence.ConnectionManager"
scope="singleton">
<constructor-arg value="jdbc:hsqldb:file:vpmDatabasetest" />
<constructor-arg value="sa" />
<constructor-arg value="" />
</bean>
он будет работать. И получите последнюю версию Spring, похоже, вы используете очень старую версию. Кроме того, я бы предложил http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/ в качестве основного источника информации о Spring.
Ответ 4
Если вы используете Maven, попробуйте добавить более новую зависимость spring - beans. Я исправляю эту проблему, обновляя зависимость jar без обновления версии xsd.