Мой app-config.xml имеет определение для моего боба UserDao:
<bean id="userDao" class="com.blah.core.db.hibernate.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
У меня есть свое сканирование компонента:
<context:component-scan base-package="com.blah" />
Мое индексное действие в моем HomeController хорошо работает (это производит содержание метода на моем UserService к шаблону freemarker).
@Controller
public class HomeController {
@Autowired
private UserService userService;
@RequestMapping("/")
public ModelAndView Index() {
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
mav.addObject("message", userService.sayHello());
mav.addObject("username", userService.getTestUser());
return mav;
}
'getTestUser ()' новый метод, который ссылается на UserDao, он похож:
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserDao userDao;
public String sayHello() {
return "hello from user service impl part 2";
}
public String getTestUser() {
return userDao.getById(1L).getUsername();
}
}
Я получаю ошибку:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.blah.core.db.hibernate.UserDao com.blah.core.services.UserServiceImpl.userDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.blah.core.db.hibernate.UserDao] 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)}
Пытались ли вы экспортировать все зарегистрированные bean-компоненты Spring (или читали журнал начальной загрузки Spring или память через отладку ), чтобы узнать, есть ли ] bean-компонент userDao
находится в списке. Убедитесь, что UserDaoImpl
действительно реализует UserDao
- я указываю на это, потому что не вижу здесь фрагмента UserDaoImpl
.
Если вы не используете @Autowired
, альтернативой будет явное получение ссылки на bean-компонент через ApplicationContext getBean () (что считается грязным способом, исправьте @Autowired
), через имя компонента, имя класса и т. Д.