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;

(およびそのゲッターとセッター)子供のクラスから、問題は解決されました!何故ですか?

そして、これは私のSpring構成です:

<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基本的に、2つの変数があります。1つは基本クラスに表示され、もう1つはサブクラスに表示されます。SpringはCommonResources.setUserManager()メソッドのオーバーライドを使用しますBaseResource.setUserManager()。オーバーライドされたバージョンは、最も近い(プライベート)userManagerフィールドを使用します。

そのフィールドを削除すると、コンパイラは基本クラスの保護されたフィールドを使用します。基本的にこれがJavaの仕組みであり、Springはここでは何の関係もありません。将来このような問題を回避するには、すべてのフィールドを非公開にし、セッターをオーバーライドしないようにします。

も参照してください

于 2012-08-16T08:24:07.267 に答える