2016-04-29 57 views
0

基本上我有兩個bean實現相同的接口。一個是配置文件「默認」,另一個是「整合」。創建bean時出錯,因爲它是一個接口?

public interface SomeClientIfc { ... } 

@Component 
@Profile(value={"functional", "integration"}) 
public class StubSomeNIOClient implements SomeClientIfc {...} 

public class SomeNIOClient implements SomeClientIfc {...} 

@Configuration 
@Profile("default") 
public class SomeClientConfiguration { 
    @Bean 
    public SomeClientIfc someClient() { 
     ... 
    SomeNIOClient someClient = new SomeNIOClient(numberOfParititions, controllerHosts, maxBufferReadSize, 
     connectionPoolSize); 
    return someClient; 
    } 
} 

在督促代碼是

@Autowired 
    public SomeUserResolver(..., SomeClientIfc someClient) {...} 

到目前爲止好,我也看到了存根豆被稱爲在集成測試。然後,我想在我的集成測試注入一些測試數據存根豆:

@ContextConfiguration(locations = {"/configProperties.xml", "/integrationTests.xml", ...}) 
@ActiveProfiles("integration") 
public class SomeTestBase { 
    @Autowired 
    private SomeClientIfc someClientIfc; 
} 

但是,在運行測試時,我得到錯誤信息

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'someClientIfc': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.audiencescience.some.client.SomeClientIfc]: Specified class is an interface 

我甚至試圖與StubSomeNIOClient更換SomeClientIfc但即使StubSomeNIOClient不是接口,仍然會得到相同的消息。

+0

代碼,我不能重現此。請提供[MCVE]。 –

+0

對不起,我是Spring的新手,這是我們生產代碼的一部分。我不知道如何提取出來。 –

回答

0

您應與Autowired一個旁邊加上註釋Qualifier指定哪些bean必須被實例化:

@Autowired 
@Qualifier("my-bean") 
+0

他們已經通過'@ Profile'實現了這一點。在集成測試期間,以上只有一個豆類將處於活動狀態。無論如何,這並不能解釋爲什麼Spring試圖實例化一個接口。 –

0

原因它試圖注入SomeClientIfc是因爲你叫變量「someClientIfc」。

在集成環境中,您已初始化所有3個類:SomeClientIfc,StubSomeNIOClient和SomeNIOClient。這給春季造成了困惑,幸運的是有辦法解決這個混亂。

一種方式是如上面一點桑蒂提到,另一種方式是命名變量「stubSomeNIOClient」見下文

@ContextConfiguration(locations = {"/configProperties.xml", "/integrationTests.xml", ...}) 
@ActiveProfiles("integration") 
public class SomeTestBase { 
    @Autowired 
    private SomeClientIfc stubSomeNIOClient; 
} 
+0

問題不在注射上。當前失敗OP詢問的是'無法實例化[com.audiencescience.some.client.SomeClientIfc]'。你的回答並不能解釋爲什麼Spring試圖實例化這種類型。 –

相關問題