2017-05-09 109 views
1

無法注入的基類直接無法注入基類@Inject註解

抽象基類

@Component 
public abstract class A{ 
} 

Here are my derived classes 
@Named("abc") 
public class B extends A{ 
} 

@Named("cde") 
public class C extends A{ 
} 

我試圖調用一個在我的資源類,但得到以下錯誤。

org.springframework.beans.factory.UnsatisfiedDependencyException:應用程序的啓動過程中

@Inject 
private A a 

@Component 
public class Resource implements ServiceImpl{ 
@Inject 
    public Resource(final Client client, 
      final A a) { 
     Assert.notNull(client); 
     Assert.notNull(a); 

     this.client = client; 
     this.a= a; 

    } 

    @Override 
    public Response method1(final Request request) { 
     Response response = null; 
     try { 
       response = (PaymentResponse) this.a.process(request); 
      } 
      catch (final Exception ex) { 
       ex.printstackTrace(); 
      } 


      return response; 
     } 
    } 

    @Override 
    public Response method2(final Request request) { 
     Response response = null; 
     try { 
      response = this.a.process(request); 
     } 
     catch (final Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return response; 

    } 
} 

錯誤錯誤創建名稱爲豆 '資源' 文件 類型的沒有合格的bean定義的 'A'被定義爲:期望單個匹配bean但發現2:b,c

回答

0

要注入正確的bean,您必須使用@Qualifier註釋。

@Inject @Qualifier("abc") 
private A a; 

現在Spring不知道你要注入什麼bean。 'abc'或'cde'。

由於您的基類是抽象的,因此您無法創建它的實例,因此spring正在嘗試注入derieved類。這就是爲什麼你必須通過正確註釋來決定哪些類需要注入。

+0

是否有替代方法。因爲我試圖將相同的基類擴展到30個不同的類。所以要避免同樣的注射30次? 。還有一種方法可以在方法級別使用限定符? – dev21

+0

如果它不一定是組件,您可以創建工廠組件並將其注入其他組件。工廠可以創建你的基類中預期的對象。我不確定你想要達到的目標,但是創建30個課程可能是不好的設計的標誌,你可能想重新思考你的解決方案。如果我幫忙,請接受我的回答。 –