Spring框架空指针异常



尝试将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());
    }
}

运行上述代码后,我得到的错误信息如所示,当我将方法更改为静态

public static  String getSadFortune()
{
    System.out.println();
    return "your day wont be good enough Sorry!!!";
}
在第2类中,我得到了期望的输出。为什么?

基本上SadFortune成员仍然是空的,这就是为什么它工作,如果getSadFortune()方法将被设置为静态

到目前为止,您只告诉Spring实例化一个Fortune bean和一个KabadiCoach,但是您必须告诉Spring KabadiCoach中的一些成员也需要自动连接。

在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"属性。在这种情况下,您可能只需要将名称写成小写。

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

最新更新