2016-10-02 19 views
0

プロパティでSpring Beanをオートワイヤリングしようとしましたが、NPEを取得しています。スニペット:スプリングフレームワークのヌルポインタ例外

INFO: Loading XML bean definitions from class path resource [autoWireByName.xml] 
Exception in thread "main" today do push-ups for 30 mins 
java.lang.NullPointerException 
    at com.springAutoWireByName.KabadiCoach.getFortune(KabadiCoach.java:23) 
    at com.springAutoWireByName.AutoWireByName.main(AutoWireByName.java:13) 

KabadiCoach.java

package com.springAutoWireByName; 

public class KabadiCoach { 

    private SadFortune sadFortune; 

    /*public KabadiCoach(){ 

     System.out.println("inside default Constructor"); 

    }*/ 
    public String getDailyWorkout() 
    { 
     return "today do push-ups for 30 mins"; 
    } 
    public void setSadFortune(SadFortune fortune) { 

     sadFortune = fortune; 
    } 

    public String getFortune() {  

     return sadFortune.getSadFortune(); 
    } 
} 

SadFortune.java

package com.springAutoWireByName; 

public class SadFortune { 

    public String getSadFortune() 
    { 
     System.out.println(); 
     return "your day wont be good enough Sorry!!!"; 
    }  
} 
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context.xsd"> 

<!-- bean definitions here --> 

<bean name="Fortune" class="com.springAutoWireByName.SadFortune"> 
</bean> 
<bean id="myCoach" class="com.springAutoWireByName.KabadiCoach" autowire="byName" /> 


<!-- this is just a prototype to define actual just make use of this file--> 

</beans> 

メイン

package com.springAutoWireByName; 

import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class AutoWireByName { 

    public static void main(String[] args) { 

     ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("autoWireByName.xml"); 

     KabadiCoach co = context.getBean("myCoach",KabadiCoach.class); 
     System.out.println(co.getDailyWorkout()); 
     System.out.println(co.getFortune()); 
    } 
} 

上記のコードを実行した後にリストされているように私は、エラーメッセージを取得していると私はクラス2で

public static String getSadFortune() 
{ 
    System.out.println(); 
    return "your day wont be good enough Sorry!!!"; 
} 

静的する方法を変更したとき、私は、所望の出力を得ました。どうして?

答えて

0

基本的に、SadFortuneメンバーはまだnullです。その理由は、getSadFortune()メソッドを静的にすると機能するからです。

今まであなただけのフォーチュンBeanとKabadiCoachをインスタンス化するために春を告げるが、あなたはKabadiCoachで一部のメンバーがあまりにもautowiredする必要があることの春を告げる必要があります。

は、あなたのSpring構成ファイルでこれを試してみてください:

<bean id="fortune" class="com.springAutoWireByName.SadFortune"></bean> 
<bean id="myCoach" class="com.springAutoWireByName.KabadiCoach" autowire="byName"> 
    <property name="fortune" ref="fortune" /> 
</bean> 

編集:申し訳ありませんが、autowire="byName"属性をoverread。この場合、おそらく小文字で名前を書いているだけです。

<bean id="fortune" class="com.springAutoWireByName.SadFortune"/> 
<bean id="myCoach" class="com.springAutoWireByName.KabadiCoach" autowire="byName"/>