Пролет 3: Автоматично свързване на bean, деклариран в контекста на xml приложение, към @Component bean

Имам проблем с автоматичното свързване на свойство на bean в моя клас, декларирано като @Component. Опитах няколко различни неща, но за съжаление получавам NoSuchBeanDefinitionException по време на пролетната конфигурация за този конкретен боб.

По-долу е примерен код, за да моделирам това, което имам в момента.

package com.foo.bar;

@Component
public class MyDeployer implements ApplicationContextAware
{
    @Autowired
    private ClusterRegistry clusterRegistry; //The bean I am trying to wire

    ...
}

В контекста на моето приложение имам следното:

<beans ...... />
    <context:component-scan base-package="com.foo.bar" />
    <context:annotation-config />

    <bean id="clusterRegistry" name="clusterRegistry" class="com.my.implementation.ClusterRegistryFileImpl" />
</beans>

Моят клас ClusterRegistryFileImpl е дефиниран по-долу:

package com.my.implementation;

public final class ClusterRegistryFileImpl implements ClusterRegistry
{
    ...
}

Обърнете внимание, че ClusterRegistryFileImpl имплементира интерфейса ClusterRegistry и този интерфейс/клас на внедряване няма зависимости. Тези файлове също не използват сканиране на компоненти (и не са анотирани от @Component, но не мисля, че ще трябва да бъдат, ако декларирам bean-а в моя appContext.

Моят интеграционен тест изглежда така

@ContextConfiguration(locations= {
    "/com/app/context/path/appContext.xml",
    "/com/app/context/path/aDifferentAppContext.xml"
})
public class MyDeployerTest extends AbstractTestNGSpringContextTests
{
    @Autowired
    private MyDeployer deployer; //class that uses the bean I need

    @Test
    protected void testDeployerStartup()
    {
        deployer.startup();
        ...
    }

}

По-долу е грешката:

Caused by: 
  org.springframework.beans.factory.NoSuchBeanDefinitionException: 
  No qualifying bean of type [com.my.implementation.ClusterRegistry] found for dependency: 
  expected at least 1 bean which qualifies as autowire candidate for this dependency.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Всякакви предложения или насоки ще бъдат много оценени.


person Burzum619    schedule 07.05.2014    source източник
comment
Изглежда добре за мен. Има ли шанс да покажете класа за внедряване?   -  person Dirk Lachowski    schedule 08.05.2014
comment
Разбира се, въпреки че не съм сигурен колко полезно би било. Класът на изпълнение е в същия пакет като неговия интерфейс.   -  person Burzum619    schedule 08.05.2014
comment
Вашето приложение десктоп ли е или уеб?   -  person n3k0    schedule 08.05.2014
comment
Хм, последен час. Има ли включени аспекти?   -  person Dirk Lachowski    schedule 08.05.2014
comment
Приложението ми е уеб приложение. В този код няма включени аспекти. Благодаря, че погледнахте момчета.   -  person Burzum619    schedule 08.05.2014
comment
Освен това не съм сигурен дали има значение, но импортирам контекста на приложението си в теста си за интеграция, като използвам следното: @ContextConfiguration(locations = {/com/my/app/context/appContext.xml})   -  person Burzum619    schedule 08.05.2014
comment
Грешката само във вашите интеграционни тестове ли се показва?   -  person Dirk Lachowski    schedule 08.05.2014
comment
Можете ли също така да публикувате кода за теста, който е неуспешен? Spring не се ли оплаква, когато стартирате приложението в нормална среда?   -  person geoand    schedule 08.05.2014
comment
Не съм стартирал приложението в нормална среда (проектът ми е част от много по-голяма рамка). В крайна сметка намерих малко заобиколно решение, което е залепване на декларацията на bean в друг контекст на приложение, който импортирах в моя интеграционен тест (използване на анотацията @ContextConfiguration spring). Ще публикувам примерен тестов код.   -  person Burzum619    schedule 08.05.2014


Отговори (1)


Вашият клас ClusterRegistryFileImpl трябва да има анотация (като @Service, ако е клас на услугата, или @Repository или @Component).

И не съм сигурен дали крайният достъп се прилага.

person n3k0    schedule 07.05.2014
comment
Опитах това (заедно с добавянето на пакета, в който живеят класовете Interface/Implementation, в атрибута basepackage в декларацията за сканиране на компоненти). Няма късмет, за съжаление. - person Burzum619; 08.05.2014