J'expérimente Spring, je suis le livre Spring: Le cahier du développeur. Je reçois cette erreur:
"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?"
.. et je suis tout à fait perdu.
J'ai une classe ArrayListRentABike
qui implémente 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;
}
}
Et mon RentABike-context.xml
est le suivant:
<?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>
Des idées s'il vous plaît? Merci beaucoup! Krt_Malta
Étant donné que le paramètre transmis au constructeur initialise la storeName
, vous pouvez utiliser l'élément constructor-arg
pour définir la storeName
.
<bean id="rentaBike" class="ArrayListRentABike">
<constructor-arg value="Bruce's Bikes"/>
</bean>
Les éléments constructor-arg
permettent de transmettre des paramètres au constructeur (surprise, surprise) de votre haricot de printemps.
Vous utilisez l'injection de setter mais vous n'avez pas défini de setter pour l'attribut storeName
. Ajoutez un setter/getter pour storeName
ou utilisez une injection de constructeur.
Étant donné que vous avez déjà défini un constructeur qui prend storeName
en entrée, je vous demanderais de changer votre RentABike-context.xml
comme suit:
<bean id="rentaBike" class="ArrayListRentABike">
<constructor-arg index="0"><value>Bruce's Bikes</value></constructor-arg>
</bean>
Cette erreur se produit car storeName non défini pour la solution de valeur se trouve dans:
<bean id="rentaBike" class="ArrayListRentABike">
<property name="storeName"><value>"Bruce's Bikes"</value></property>
</bean>