2012-02-24 59 views
1

这里是我的xml配置:Spring MVC @Autowire不工作 - 循环依赖?

<bean id="diameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start"> 
    <constructor-arg index="0"><value>${pcca.host}</value></constructor-arg>  
    <constructor-arg index="1"><value>${pcca.port}</value></constructor-arg>  
    <constructor-arg index="2" value="com.rory.djgx.message"/> 
    <constructor-arg index="3" value="com.rory.djgx.avp"/> 
    <constructor-arg index="4"> 
    <list> 
     <ref bean="asrHandler"/> 
     <ref bean="aaaHandler"/> 
     <ref bean="ceaHandler"/> 
     <ref bean="dwaHandler"/> 
     <ref bean="staHandler"/> 
    </list> 
    </constructor-arg> 
</bean> 

<bean id="asrHandler" class="com.rory.ptspsim.messagereceivers.ASRHandler"/> 
<bean id="aaaHandler" class="com.rory.ptspsim.messagereceivers.AAAHandler"/> 
<bean id="ceaHandler" class="com.rory.ptspsim.messagereceivers.CEAHandler"/> 
<bean id="dwaHandler" class="com.rory.ptspsim.messagereceivers.DWAHandler"/> 
<bean id="staHandler" class="com.rory.ptspsim.messagereceivers.STAHandler"/> 

这里是ASRHandler类的开始:

public class ASRHandler implements DiameterMessageHandler 
{ 
    @Autowired 
    private DiameterClient diameterClient; 

任何人都不会有为什么这心不是工作的任何想法?我意识到处理程序类和DiameterClient类相互依赖,但我虽然已经考虑到了这一点。

下面是从日志消息:

org.springframework.beans.factory.BeanCreationException:错误创建名称为豆“diameterClient”在ServletContext的资源[/WEB-INF/applicationContext.xml的]定义:不能在使用键[0]设置构造函数参数时解析对bean'asrHandler'的引用;嵌套的例外是org.springframework.beans.factory.BeanCreationException:错误创建名为“asrHandler”豆:资源依赖注射失败;嵌套的异常是org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为'diameterClient'的bean时出错:请求的bean当前正在创建:是否存在无法解析的循环引用?

谢谢!

+0

将会有更多的启发记录其他地方。它会告诉你什么是错的。 – skaffman 2012-02-24 15:32:24

回答

2

这当然是循环依赖。你应该看到Spring引发的BeanCurrentlyInCreationException

豆在被实例化时不能被引用。问题是你正在使用构造函数注入来创建你的bean。

我看到两件事应该能够解决这个问题。

  1. 基于我假设它的DiameterClient包名是你在控制类。我会推荐自动装配该类的所有依赖项,就像您在xxxHandler类中使用的那样。你甚至应该可以使用List<DiameterMessageHandler>,Spring会将所有实现该接口的bean加载到列表中。
  2. 在bean上使用基于属性的注入(而不是constructor-arg元素,使用property元素)。

编辑:

如果你有你的文件看起来是这样的:

<bean id="diameterClient" class="com.rory.ptspsim.diameterclient.DiameterClient" scope="singleton" init-method="start"/> 

<bean id="asrHandler" class="com.rory.ptspsim.messagereceivers.ASRHandler"/> 
<bean id="aaaHandler" class="com.rory.ptspsim.messagereceivers.AAAHandler"/> 
<bean id="ceaHandler" class="com.rory.ptspsim.messagereceivers.CEAHandler"/> 
<bean id="dwaHandler" class="com.rory.ptspsim.messagereceivers.DWAHandler"/> 
<bean id="staHandler" class="com.rory.ptspsim.messagereceivers.STAHandler"/> 

这:

public class DiameterClient { 
    @Autowired 
    private List<DiameterMessageHandler> handlers; 

    @Value("${pcca.host}") 
    private String host; 

    @Value("${pcca.port}") 
    private int port; // or String... 

    // I don't know what these other two would be...if they are autowired, or just values you would populate... 
    private String somePackage; 

    private String anotherPackage; 

    // methods go here... 
} 

那么List<DiameterMessageHandler>将包含5你在你的di下定义的bean ameterClient bean在你的xml中。如果订单很重要,您可能需要按照特定的顺序在您的上下文中指定它们,否则它应该可以正常工作。

You could even take this further and annotate your classes with a Stereotype annotation (@Component most likely) and do a context:component-scan on the packages that contain these classes. That would mean even less xml declaration.

+0

谢谢 - 如果你有一个例子,你能用一个例子来解释一下吗? “你甚至应该能够@Autowired List ,并且Spring会将所有实现了该接口的bean加载到列表中。” – Rory 2012-02-24 16:32:54

+0

@Rory检查我的编辑。 – 2012-02-24 16:55:04

+0

谢谢。但是现在似乎是设置属性的问题:无法将类型'java.lang.String'的值转换为所需的类型'int';嵌套异常是java.lang.NumberFormatException:对于输入字符串:“$ {pcca.port}” – Rory 2012-02-24 18:24:16

0

有你无论是@Component @Service,@Repository或@Controller注解类,居然忘了你在一个ASRHandler接线到Diameter客户端时,Diameter客户端是在ASRHandler,这是圆,asr处理程序是否需要自己的直径客户端?