2015-02-08 2 views
0

Я новый весной. Я делал пример из книги - «Весна в действии 2». В этом примере описывается, как писать ваши бобы и в конце получилась ошибка. Помогите мне решить эту проблему, пожалуйста. Вот код:Got Pre-instantiating error 1

package com.my.quest; 
public interface Instrument { 
    void play(); 
} 

package com.my.quest; 
public class Piano implements Instrument { 
    public Piano(){} 
    @Override 
    public void play() { 
     System.out.println("text"); 
    } 
} 

package com.my.quest; 
public interface Performer { 
    void perform(); 
} 

package com.my.quest; 
public class Instrumentalist implements Performer { 

    private Instrument inst; 
    private String song; 

    public Instrumentalist() { 
    } 

    void setSong(String song){ 
     this.song = song; 
    } 

    void setInstrument(Instrument inst){ 
     this.inst = inst; 
    } 

    @Override 
    public void perform() { 
     System.out.println("Playing " + song); 
     inst.play(); 
    } 
} 

боб называется - config.xml:

<?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-2.0.xsd"> 

    <bean id="kenny" class="com.my.quest.Instrumentalist"> 
    <property name="song" value="Cage The Elephant – Shake Me Down" /> 
    <property name="inst" ref="piano"/> 
    </bean> 

    <bean id="piano" class="com.my.quest.Piano"> 
    </bean> 

</beans> 

I`ve испытаны таким образом, и это работает:

package com.my.quest; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class QuestStart { 

    public static void main(String[] args) {  

     Instrument inst = new Piano(); 
     Instrumentalist in = new Instrumentalist(); 
     in.setInstrument(inst); 
     in.setSong("Cage The Elephant – Shake Me Down"); 
     in.perform(); 
    } 
} 

Результат: набрав сообщение консоль -> Игра в клетку Слон - Встряхните меня: текст

Но если я использую это:

package com.my.quest; 
    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.support.ClassPathXmlApplicationContext; 

    public class QuestStart { 

     public static void main(String[] args) {  

      ApplicationContext ctx = new ClassPathXmlApplicationContext("com/my/quest/config.xml"); 
      Performer p = (Performer)ctx.getBean("kenny"); 
      p.perform(); 
     } 
    } 

Я получаю эту ошибку:

фев 08, 2015 11:25:51 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]7106e68e: startup date [Sun Feb 08 23:25:51 EET 2015]; root of context hierarchy 
фев 08, 2015 11:25:52 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [com/my/quest/config.xml] 
фев 08, 2015 11:25:52 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]256216b3: defining beans [kenny,piano]; root of factory hierarchy 
фев 08, 2015 11:25:52 PM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons 
INFO: Destroying singletons in org.s[email protected]256216b3: defining beans [kenny,piano]; root of factory hierarchy 
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kenny' defined in class path resource [com/my/quest/config.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'song' of bean class [com.my.quest.Instrumentalist]: Bean property 'song' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 
    at com.my.quest.QuestStart.main(QuestStart.java:19) 
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'song' of bean class [com.my.quest.Instrumentalist]: Bean property 'song' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter? 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1031) 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:899) 
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76) 
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358) 
    ... 13 more 

Dowloaded несколько JAR`s:

  1. org.springframework.context и context.support - 3.1.0.M2
  2. орг .springframework.asm - 3.1.0.M2
  3. org.springframework.expression - 3.1.0.M2
  4. org.springframework.beans - 3.1.0.M2
  5. org.springframework.core - 3.1.0.M2
  6. org.apache.common.logging

Помощь, покажите мне, что я делаю неправильно, пожалуйста.

ответ

2

Метод setSong должен быть public для Instrumentalist фасоли:

public void setSong(String song) { 

В общем случае должно быть соответствие getSong метод также.

+0

Спасибо, он решил 1 ошибка. Добавлены модификаторы и getter, но еще один всплыл: Invalid property «inst» из bean-класса [com.my.quest.Instrumentalist]: свойство bean «inst» не доступно для записи или имеет неверный метод setter. – Anthony

+0

Такая же проблема: нет метода 'setInst', который является' public' ... – Reimeus

+0

Омг, извините, ребята, я вообще невнимателен. У моего сеттера было неправильное имя: public void setInstrument vs setInst. Спасибо за помощь. – Anthony

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