2010-10-14 1 views
9

Я экспериментирую с Spring, я следую за книгой: Spring: ноутбук разработчика. Я получаю эту ошибку:Spring: свойство Bean недоступно для записи или имеет неверный метод setter

"Bean property 'storeName' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?"

.. и я совершенно потерял.

У меня есть ArrayListRentABike класс, который реализует RentABike:

import java.util.*; 

public class ArrayListRentABike implements RentABike { 
    private String storeName; 
    final List bikes = new ArrayList(); 

    public ArrayListRentABike() { initBikes(); } 

    public ArrayListRentABike(String storeName) { 
     this.storeName = storeName; 
     initBikes(); 
} 

public void initBikes() { 
    bikes.add(new Bike("Shimano", "Roadmaster", 20, "11111", 15, "Fair")); 
    bikes.add(new Bike("Cannondale", "F2000 XTR", 18, "22222", 12, "Excellent")); 
    bikes.add(new Bike("Trek", "6000", 19, "33333", 12.4, "Fair")); 
} 

public String toString() { return "RentABike: " + storeName; } 

public List getBikes() { return bikes; } 

public Bike getBike(String serialNo) { 
    Iterator iter = bikes.iterator(); 
    while(iter.hasNext()) { 
     Bike bike = (Bike)iter.next(); 
     if(serialNo.equals(bike.getSerialNo())) return bike; 
    } 
     return null; 
    } 
} 

И мой RentABike-context.xml это:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd"> 

<beans> 

    <bean id="rentaBike" class="ArrayListRentABike"> 
     <property name="storeName"><value>"Bruce's Bikes"</value></property> 
    </bean> 

    <bean id="commandLineView" class="CommandLineView"> 
     <property name="rentaBike"><ref bean="rentaBike"/></property> 
    </bean> 

</beans> 

Любые идеи, пожалуйста? Спасибо большое! Krt_Malta

ответ

10

Поскольку параметр, передаваемый в конструктор инициализирует storeName, вы можете использовать constructor-arg элемент для установки storeName.

<bean id="rentaBike" class="ArrayListRentABike"> 
    <constructor-arg value="Bruce's Bikes"/> 
</bean> 

В constructor-arg элементы позволяют передавать параметры конструктору (сюрприз, сюрприз) вашего весеннего боба.

12

Вы используете инжектор сеттера, но не имеете сеттера, определенного для атрибута storeName. Либо добавьте сеттер/приемник для storeName, либо используйте инъекцию конструктора.

Поскольку у вас уже есть конструктор, определенный, который принимает в качестве входных данных storeName я бы сказал, изменить ваш RentABike-context.xml на следующее:

<bean id="rentaBike" class="ArrayListRentABike"> 
    <constructor-arg index="0"><value>Bruce's Bikes</value></constructor-arg> 
</bean> 
+0

И если имя свойства «myDataSource» (имя свойства = «myDataSource»), то ваш сеттер должен быть назван setMyDataSource(); не похоже на setDataSource. –

+0

Также SPRING ожидает getter с таким же типом возвращаемого свойства, как getMyDataSource(). И как getter/setter должны быть доступны на уровне общего доступа. –

0

Эта ошибка возникает из-за StoreName не определено для решения значения в:

<bean id="rentaBike" class="ArrayListRentABike"> 
    <property name="storeName"><value>"Bruce's Bikes"</value></property> 
</bean> 
Смежные вопросы

 Смежные вопросы