2013-07-24 77 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的名字。谢谢 –