java - Spring MVC @Autowire 不工作 - 循环依赖?

标签 java spring spring-mvc web.xml

这是我的 xml 配置:

<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 类相互依赖,但我认为 Spring 已经解决了这个问题。

这是日志中的消息:

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

谢谢!

最佳答案

这肯定是一个循环依赖。您应该看到 BeanCurrentlyInCreationException由 Spring 抛出。

Bean 已经被实例化时就不能被引用。问题是您正在使用构造函数注入(inject)来创建 bean。

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

  1. 基于包名称 DiameterClient我假设这是一个由您控制的类(class)。我建议 Autowiring 该类的所有依赖项,就像您的 xxxHandler 一样。类。您甚至应该能够@Autowired一个List<DiameterMessageHandler> ,Spring 将加载所有 bean将该接口(interface)实现到列表中。
  2. 在您的 Bean 上使用基于属性的注入(inject)(使用 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>将包含您在 xml 中的diameterClient bean 下定义的 5 个 bean。如果顺序很重要,您可能需要在上下文中以特定顺序指定它们,但否则它应该可以正常工作。

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.

关于java - Spring MVC @Autowire 不工作 - 循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433304/

相关文章:

java - 可能导致错误的原因是什么

java - 在xml中定义Spring @PropertySource 并在Environment中使用

css - 我应该将 Spring MVC 的 CSS 和 JS 文件放在哪里?

与 Paypal 的 Spring 请求映射

java - 如何使用 Spring、Hibernate 和 PostgreSQL 将数据导出到 Excel?

java - Spring 3 Web 请求拦截器——如何获取 BindingResult?

java - 具有 Eager fetch Type 属性的对象执行对该属性的延迟加载属性的查询。为什么?

java - 如何以 sbt 汇编后可访问的方式打开我的资源目录中的文件?

Java - 格式化 double 组

java - Spring MVC 4 : "application/json" Content Type is not being set correctly