0

我在一個類中注入依賴。但是當我調用該類的方法時沒有找到。春天奇怪的行爲DI

public StudentValidator extends MyValidator implements Validator{ 

    private StudentRepository studentRepository; 
//setter for the same 

public void validate(Object obj,Errors errors){ 

    validateStudent(Obj) 
} 
} 



public class MyValidator{ 

    private StudentRepository studentRep; 

    public void setStudentRep(StudentRepository studentRep){ 

    System.out.println("This is printing on Tomcat console"); 
    this.studentRep=studentRep 
    System.out.println("This is also printing"+studentRep+" with hashcode"); 
    } 

    public void validateStudent(Object obj){ 

    studentRep.findStud(); getting here NullPointerException 
    } 

} 

無需編寫Spring servlet,因爲我可以看到依賴已經通過Syso語句注入到setter中。

相同的問題會是什麼?

UPDATE

爲spring-servlet.xml

<beans> 
     <bean id="studentValidator" class="SyudentValidator" > 
      <property name="studentRepository" ref="studentRepository"> 
     </bean> 

     <bean id="myValidator" class="MyValidator"> 
      <property name="studentRep" ref="studentRepository"> 
     </bean> 

     <bean id="studentRepository" class="StudentRepository"> 


    </beans> 

NullPointerException異常是不是我的問題。問題是爲什麼我在這種情況下得到空指針,因爲Syso語句正在打印我的依賴關係哈希碼。

+0

您已經省略了'StudentValidator'類的'studentRepository'字段的setter - 它是否與'MyValidator'上的setter具有相同的'println'語句? –

+0

是的...在學生驗證器中我得到的是參考,但沒有在超類中。 –

回答

0

假設都MyValidator和StudentValidator是春天豆,你應該嘗試:

豆ID = 「myValidator」 級= 「MyValidator.java」>

豆ID = 「studentValidator」 級=「StudentValidator。 Java的「父=」 myValidator>

您必須通知春天,有一種繼承。

+0

我有NullPointer的解決方案。但不是爲什麼即使我的依賴變量注入引用後,我得到的。 –

0

您已經聲明StudentRepository類型兩次的領域,這是混亂的,但這裏是我想是怎麼回事。

我假設您正在創建StudentValidator的實例,該實例將設置字段StudentValidator.studentRepository。但是,您的validateStudent方法使用的字段MyValidator.studentRep將保持null,因此NullPointerException

基本上,只有方法可以在Java中重寫,而不是在字段中重寫。

如果你真的需要這種不必要的繼承結構,代碼應爲:

public class MyValidator 
{ 
    private StudentRepository studentRepository; 

    public void setStudentRepository(StudentRepository studentRepository) 
    { 
    this.studentRepository = studentRepository; 
    } 

    public void validateStudent(Object obj) 
    { 
    studentRepository.findStud(); 
    } 
} 

public StudentValidator extends MyValidator implements Validator 
{ 
    @Override 
    public void validate(Object obj, Errors errors) 
    { 
    validateStudent(Obj) 
    } 
} 

雖然我會忍不住把它簡化爲:

public class StudentValidator implements Validator 
{ 
    private StudentRepository studentRepository; 

    public void setStudentRepository(StudentRepository studentRepository) 
    { 
    this.studentRepository = studentRepository; 
    } 

    @Override 
    public void validate(Object obj) 
    { 
    studentRepository.findStud(); 
    } 
} 

UPDATE

基於上面的Spring配置,我可以看到你正在創建兩個類的實例 - 不確定爲什麼你會這樣做,如果你不是將使用myValidator bean作爲studentValidator bean的父項,但無論哪種方式,如果只有一個bean,則使用父項會使Spring配置無理由複雜化。

你要在一個validateStudentNullPointerException原因是因爲你從來沒有設置在studentValidator豆的studentRep,你只能把它放在了myValidator豆(它們是兩個不同的實例)。

鑑於此,你的Spring配置應該是:

<beans> 

    <bean id="studentValidator" class="SyudentValidator" > 
    <property name="studentRepository" ref="studentRepository"> 
    <property name="studentRep" ref="studentRepository"> 
    </bean> 

    <bean id="studentRepository" class="StudentRepository"> 

但正如我說,你的類設計是擺在首位,這使得這個Spring配置混亂看起來很怪異,你'重新設置對同一個bean的引用studentRepository,兩次。

我的建議是應用我最初建議的類更改,它只是簡單地將整個設計作爲一個整體,並且使錯誤地配置應用程序變得更加困難。

+0

我得到了解決方案。但我的問題是它被注入並證明setter,那麼爲什麼再次依賴父項變爲空 –

+0

父類中的字段從未設置,你會覆蓋基類中的setter。 –

+0

設定。因此,我正在打印哈希碼,請參閱我的setter方法。 –