0

我有一個基於xml-config的spring應用程序,其中我的一個bean需要作爲構造器參數com.typesafe.config.Config參數。 爲此,我們有一個@Configuration類,其中一個方法(註釋爲@Bean)返回一個com.typesafe.config.Config對象。如何從返回接口(com.typesafe.config.Config)的方法(@Bean)在xml中注入Bean?

但是,當春天開始就抱怨說,「未能實例[com.typesafe.config.Config]:指定類是一個接口」

如何通過XML注入了getconfig返回對象到構造函數?

這裏是代碼片段簡化擺脫應用邏輯:

import com.typesafe.config.Config; 
... 
public class myFilter implements Filter { 
    public myFilter(Config aconfig) { 
     ... 
    } 
} 

然後,我有一個JavaConfig類,如下所示創建我需要在myFilter構造注入豆:

@org.springframework.context.annotation.Configuration 
public class TSConfiguration { 
    ... 
    @Bean(name = "app-config") 
    public Config getConfig() { 
    ... 
    } 
} 

我已經把我的spring.xml文件中的以下內容:

<beans:bean class="TSConfiguration" /> 
<beans:bean id="app-config" class="com.typesafe.config.Config"/> 
<beans:bean id="theFilter" class="myFilter"> 
    <beans:constructor-arg index="0" ref="app-config"/> 
</beans:bean> 

這裏從春季例外:

15-Feb-2017 13:19:55.463 SEVERE [localhost-startStop-1] org.springframework.web.context.ContextLoader.initWebApplicationContext Context initialization failed 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'app-config' defined in ServletContext resource [/WEB-INF/spring-security.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.typesafe.config.Config]: Specified class is an interface 

Thanx。

回答

1

的那一行是這樣的:

<beans:bean id="app-config" class="com.typesafe.config.Config"/>

既然你已經把這個在您的spring.xml,春天正試圖實例化一個bean叫app-configConfig。但Config是一個接口,所以Spring無法實例化它,從而導致錯誤。

我想,一旦你刪除它,Spring會選擇你使用getConfig實例化的@Bean。如果這不起作用,請參閱TSConfiguration是否正確導入到您的spring.xml

+0

我試圖將其刪除,但仍然無法正常工作。刪除我得到的bean定義線 設置構造函數參數時無法解析對bean'app-config'的引用;嵌套異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:沒有定義名爲'app-config'的bean – MDot

+0

我沒有從TSConfiguration bean中得到任何錯誤。 – MDot

+0

我沒有從TSConfiguration bean中得到任何錯誤:刪除myFilter bean定義需要app-config,不會引發其他異常。我留在TSConfiguration中,沒有給出錯誤。 – MDot

0

要添加到另一個答案,您聲明瞭可能打算成爲同一個bean的兩次。

在這裏,你告訴春天到名爲app-config創建配置類型的豆:

@Bean(name = "app-config") 
public Config getConfig(){ 

在這裏,你試圖用id app-config創建Config類型的另一個bean。

<beans:bean id="app-config" class="com.typesafe.config.Config"/> 

如果您在聲明一個JavaConfig豆,沒有必要在XML,反之亦然再次聲明(假設你的目的是使該類型的一個bean)。

而且,正如已經指出的那樣,您不能實例化一個接口。


更新時間:

我要去基本上中途忽略您發佈的代碼,似乎有什麼樣的註釋做一個誤區,以及如何使用它們。

首先,如果你想要做的純XML的一切,你不能做到這一點:

<beans:bean id="app-config" class="com.typesafe.config.Config"/> 

你需要做的具體實現這個接口的。但是,根據你發佈的內容,你有一個你正在使用的配置類。讓我們開始認爲:

package com.testpackage; 

@Configuration 
public class Config { 


     @Bean 
     public SomeInterface someImplementation(){ 
      return new SomeInterface() { 
       @Override 
       public String implementation() { 
        return "String"; 
       } 
      }; 
     } 
    } 

這是說創造SomeInterface類型的豆。此bean的名稱將繼承方法名稱someImplementation,因此手動爲它命名是毫無意義的。請注意,雖然這是返回一個接口,但我們正在創建一個匿名類並返回它。

接下來,我們將在XML爲上述看一看:我們正在掃描

<beans> 
     <context:component-scan base-package="com.testpackage"/> 

     <bean class="com.testpackage.ConcreteClass"> 
      <constructor-arg index="0" ref="someImplementation"/> 
     </bean> 
</beans> 

通知(context:component-scan)封裝用在它的配置。如果我們使用@Configuration註釋,我們可以執行組件掃描。

下面的例子做同樣的事情,但只是手動聲明配置Bean:

<beans> 
     <bean class="com.testpackage.Config"/> 

     <bean class="com.testpackage.ConcreteClass"> 
      <constructor-arg index="0" ref="someImplementation"/> 
     </bean> 
</beans> 

如果您手動聲明類似上面的配置類,你不需要用@Configuration進行註解。該註釋的重點是組件掃描以「查看」bean並實例化它。由於我們手動完成,所以不需要註釋。

而且,爲了完整起見,這是檢驗一切工作單元測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:META-INF/appContextTest.xml"}) 
public class SomeTester { 


    @Autowired 
    ConcreteClass concreteClass; 

    @Test 
    public void test(){ 
     assertEquals("String", concreteClass.impl.implementation()); 
    } 
} 
+0

Followng spring JavaConfig文檔http://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html這個bean應該在xml中聲明。此外,在組件掃描中,@Bean不會被檢測爲自動實例化。 – MDot

+0

其目的是在xml bean定義中使用用JavaConfig定義的bean。遵循本指南http://docs.spring.io/spring-javaconfig/docs/1.0.0。m3/reference/html/creating-bean-definitions.html(很少更新與移除ConfigurationPostProcessor有關)我遇到了問題。我試圖聲明它,因爲它不會自動注入並需要傳遞給myFilter構造函數。 – MDot

+0

該文檔中沒有任何內容說明它應該在XML和JavaConfig中。它不應該在兩個地方。在這一點上你的問題有點不清楚。你應該用一個你想要解決的問題的完整例子來製作一個新的例子。您現有的問題已被正確回答。 –

相關問題