0

我有一堂课BaseResource.java如下:

public class BaseResource{

    protected UserManager userManager;
    public void doSth(){
        Object obj = userManager.returnObject(); //This is where exception is thrown
    }
    public UserManager getUserManager() {
        return userManager;
    }
    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }
}

你可以看到二传手,对吧?这BaseResource有一个孩子CustomerResurce.java

public class CommonResources extends BaseResource{
    private UserManager userManager;
    public void doSthElse(){
         Object obj = doSth(); // Calling its parent's method
         //Other stuff
    }
    public UserManager getUserManager() {
        return userManager;
    }
    public void setUserManager(UserManager userManager) {
        this.userManager = userManager;
    }
}

UserManager孩子的班级中有并调用父母的方法时,JavaNullPointException上升。但是当我删除

private UserManager usermanager;

(及其getter和setter)从孩子的班级开始,问题就解决了!这是为什么?

这是我的弹簧配置:

<bean id="baseResource" class="com.datx.web.resources.core.BaseResource"
    scope="session" autowire="byName" />
<bean id="customerResources" class="com.datx.web.resources.core.CustomerResources"
    scope="session" autowire="byName" />
<bean id="userManager" class="com.datx.usermanagement.manager.UserManager"
    autowire="byName" scope="prototype"/>
4

1 回答 1

1

私有userManager字段隐藏userManager基类中的受保护字段。本质上,您现在有两个变量 - 一个在基类中可见,另一个在子类中可见。Spring 使用CommonResources.setUserManager()方法覆盖BaseResource.setUserManager()。覆盖版本使用最接近的(私有)userManager字段。

删除该字段后,编译器将使用基类中的受保护字段。基本上这就是 Java 的工作方式,Spring 与此无关。为避免将来出现此类问题,请将所有字段保密并避免覆盖 setter。

也可以看看

于 2012-08-16T08:24:07.267 回答