Подтвердить что ты не робот

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'

Что я должен использовать вместо этого?

4b9b3361

Ответ 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.