Spring MVC @Autowire не работает - круговая зависимость? - PullRequest
1 голос
/ 24 февраля 2012

Вот мой конфиг 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: Ошибка создания бина с именем 'DiameterClient', определенным в ресурсе ServletContext [/WEB-INF/applicationContext.xml]: Невозможно разрешить ссылку на бин 'asrHandler' при установке аргумента конструктора с ключом [0];вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем «asrHandler»: сбой внедрения зависимостей ресурса;вложенное исключение - org.springframework.beans.factory.BeanCurrentlyInCreationException: ошибка создания компонента с именем 'DiameterClient': запрашиваемый компонент находится в процессе создания: существует неразрешимая циклическая ссылка?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Это, безусловно, круговая зависимость.Вы должны увидеть BeanCurrentlyInCreationException, брошенный Spring.

На бины нельзя ссылаться, когда они уже созданы.Проблема заключается в том, что вы используете инжектор конструктора для создания ваших bean-компонентов.

Я вижу две вещи, которые могут это исправить.

  1. На основе имени пакета DiameterClientЯ предполагаю, что это класс, который вы контролируете.Я бы порекомендовал автоматическое подключение всех зависимостей этого класса, как у вас с xxxHandler классами.Вы даже должны иметь возможность @Autowired a List<DiameterMessageHandler>, и Spring загрузит все bean s, которые реализуют этот интерфейс, в список.
  2. Используйте внедрение на основе свойств для ваших bean-компонентов (вместо * 1016)* элемент, используйте элемент 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 bean-компонентов, которые вы определили для вашего bean-компонента DiameterClient в xml.Если порядок важен, вам может потребоваться указать их в вашем контексте в определенном порядке, но в противном случае он должен просто работать.

Вы можете даже пойти дальше и аннотировать свои классы аннотацией стереотипа (@Component, скорее всего) и выполните context:component-scan для пакетов, содержащих эти классы.Это будет означать еще меньше декларации xml.

0 голосов
/ 24 февраля 2012

Если вы аннотировали свой класс с помощью аннотации @Component @Service, @Repository или @Controller, на самом деле забыли, что вы подключаете ASRHandler к Diameter-клиенту, когда Diameter-клиент находится в ASRHandler, это циклически, обработчику asr нужен собственный диаметрный клиент?

...