web-dev-qa-db-fra.com

Spring: la propriété du bean n'est pas accessible en écriture ou a une méthode de définition invalide

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

9
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.

10
Peter Tillemans

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>
12
Richard Kettelerij

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>
0
ankit