2015-12-03 2 views
0

HyСканирование @ Консистентные бобы весной 4

Я обновляю свое веб-приложение с Spring 3.1 до 4.1.8, но с проблемами. Мой код не изменился (только мой pom.xml)

У меня есть настройки компонента в моем главном контексте, который выглядит как:

@Configuration 
public class StorableServiceConfiguration { 
    ... 
    @Bean 
    public StorableService<Template, Long> templateService(ITemplateJpaDao dao) { 
     return new DaoService<Template, Long>(Template.class, dao); 
    } 
} 

и, очевидно, где-то еще в моем веб-приложение, у меня есть это заявление:

@Autowired 
@Qualifier("templateService") 
private StorableService<Template, String> templateService; 

Теперь это все работало нормально с Spring 3.1.1, но после обновления версии 4.1.8, я получаю эту ошибку:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [w.wexpense.service.StorableService] 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), @org.springframework.beans.factory.annotation.Qualifier(value=templateService)}

Кто-нибудь понял?

Я где-то читал, что весной 4 произошли изменения в отношении того, как контекст: компонентное сканирование ведет себя в отношении аннотации @Configuration, но не может запомнить. Кто-нибудь знает об этом?

Благодаря

ответ

2

Spring 4 autowire бобы с использованием Java дженериков в виде @Qualifier.

Так у вас есть Bean @Autowired с StorableService<Template, String>, но в вашем @Configuration классе ваш @Bean объявляет StorableService<Template, Long>.

Если вы хотите StorableService<Template, String> экземпляр вы должны создать другой @Bean в вашем @Configuration классе, например:

@Bean 
public StorableService<Template, String> templateService(ITemplateJpaDao dao) { 
    return new DaoService<Template, String>(Template.class, dao); 
} 

и autowire это без @Qualifier аннотацию:

@Autowired 
private StorableService<Template, String> templateService; 

Spring 4 будет впрыскивайте его совершенно. Посмотрите на этот блог post, чтобы увидеть эту новую функцию весны 4.

+0

Спасибо большое, я пропустил это; И на самом деле это трюк ... изменил его на долго и плавно – willix

Смежные вопросы