Не удалось автоматически связать поле, но у меня есть определение - PullRequest
7 голосов
/ 19 июля 2010

В моем 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" />

Мое действие index в моем 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)}
  1. В чем может быть проблема?
  2. Если бы я не делал autowire, что бы я делал вместо добавления @AutoWire в определение UserDao.

1 Ответ

15 голосов
/ 19 июля 2010

Вы пытались экспортировать все зарегистрированные bean-компоненты Spring (или прочитали Журнал начальной загрузки Spring или память через debugging ), чтобы выяснить, присутствует ли bean-компонент userDao в списке. Пожалуйста, убедитесь, что UserDaoImpl действительно реализует UserDao тоже - я указываю на это, потому что не вижу здесь фрагмента UserDaoImpl.

Если вы не используете @Autowired, альтернативой будет явное получение ссылки на боб через ApplicationContext getBean () (что считается грязным способом, вместо этого исправьте @Autowired) через имя бина, имя класса и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...