2013-07-24 105 views
0

我正在開發的項目是一個在春季創建的框架,將打包爲jar用於其他項目。春季:自動裝配靜態自引用不起作用

現在,我正在嘗試autowire一個靜態自引用字段。我爲AuthenticationClient創建了一個bean,但仍然抱怨無法找到符合條件的自動裝配bean。我明白布線靜電領域不是一個好的選擇。但我沒有任何替代品。

public class AuthenticationClient { 

    private static AuthenticationClient client; 
    private @Autowired KerberosAPI kerberosAPI; 
    private @Autowired KerberosSessionManager kerberosSessionManager; 


    public AuthenticationClient getAuthenticationClient(){ 
     return client; 
    } 

    @Autowired 
    public void setAuthenticationClient(AuthenticationClient client){ 
     AuthenticationClient.client = client; 
    } 
} 

Servlet的語境:我宣佈我在servlet上下文內豆類這樣

<beans:bean class="com.security.kerberos.KerberosAPIImpl" /> 
    <beans:bean class="com.security.kerberos.model.KerberosSessionManager"/>  
    <beans:bean class="com.security.rest.client.AuthenticationClient" /> 

詳細的異常位置:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.security.rest.client.AuthenticationClient] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 

更新:

由於我告訴過你項目將被打包成罐子。現在,我想在必須導入inn的項目的控制器中獲得AuthenticationClient的實例。父項目可能不是一個春季項目,所以我需要有一種方法來獲取AuthenticationClient的實例,而不需要自動裝配它。之所以我必須走這條路。請讓我知道是否需要更多信息。

@Controller 

public class Test { 

@RequestMapping(value="/test") 
public void test(){ 
    AuthenticationClient client = AuthenticationClient.getAuthenticationClient(); 
} 

}

+2

哪裏是被初始化AuthenticationClient'的'第一個實例?春天是否意識到這種情況?它似乎並不知道它的任何實例。 (順便說一句,以這種方式設置靜態實例非常奇怪) – jbx

+0

我不明白你的意思是什麼? 我已經包含了我在我的servlet-context –

+0

中聲明的bean,其類型完全是靜態字段?你自己的類'AuthenticationClient'? –

回答

1

嘗試用@Resource註解。

@Autowired在尋找候選人時跳過註釋的bean本身。

看到How to autowire bean in same bean

+0

不需要嘗試。這將工作:-) – Bart

+0

試過並失敗! :( 我得到了同樣的異常NoUniqueBeanDefinitionFound。我想這個問題是關係到靜態自引用。 –

+0

它的工作。我必須包括在資源註解的bean的名字。謝謝 –