2014-12-20 2 views
2

У меня есть проект Spring MVC. У меня есть контроллер класса, сервис и уровень dao.Почему @Autowired не работает вне класса контроллера весной mvc?

@Controller 
public class HomeController { 

    @Autowired 
    private PersonFacade personFacade; 
    .... 
} 

У меня есть класс обслуживания

@Service 
@Transactional 
public class PersonFacadeImpl implements PersonFacade{ 

    @Autowired 
    private PersonDAO personDAOdef; 

    //code .... 
} 

И, наконец, мой класс DAO

@Repository 
public class PersonDAOImpl implements PersonDAO{ 
    @Autowired 
    private SessionFactory sessionFactory; 
    //code 
} 

Это работает ОТЛИЧНО, моя проблема его здесь:

Я сделал класс слушателя и Я хотел бы использовать PersonFacade с @Autowired

public class PersonListener extends AbstractRepositoryEventListener<Person> { 

    @Autowired 
    private PersonFacade personFacade; 
    .... //code 
} 

И я это исключение:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name  
'personListener': Injection of autowired dependencies failed; nested exception is  
org.springframework.beans.factory.BeanCreationException: Could not autowire field: 
private com.gabrielglez.main.Facade.PersonFacade 
com.gabrielglez.main.evenlistener.PersonListener.personFacade; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of 
type [com.gabrielglez.main.Facade.PersonFacade] 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)} 

У меня есть этот класс в другом пакете, и я не знаю, почему в этом классе Spring не может создать объект и внутри контроллера работает отлично.

Я не знаю, что происходит.

Вот его мой сервлет-контекст: https://github.com/tsw1985/HelloHibernate/blob/master/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml

В нескольких словах, если я хочу, чтобы ввести одну зависимость с @Autowired из стороны класса контроллера, у меня будет та же самая проблема. Спасибо всем.

Пожалуйста, если вы поможете мне, вы спасете мою жизнь, потому что у меня есть одна неделя с этой проблемой.

Спасибо всем!

+1

Какую версию Spring вы используете? – mkobit

+0

Как насчет того, как вы создаете интерфейс, реализуете свой класс в созданном интерфейсе, а затем автоматически создаете интерфейс. –

ответ

3

@ Работает только на объектах, управляемых весной. Поэтому аннотируйте свой класс PersonListener, например, с @Component и не создавайте экземпляр как new Object(). Используйте, например, @Autowired для получения экземпляра.

+0

Himjames, Может быть, я не объясню, хорошо ли моя проблема. Проблема в том, что я хочу, чтобы Inject мой класс PersonFacade в моем LISTENER, потому что в слушателе я хочу делать с ним что-то. Проблема в том, что когда я хочу вставить этот объект в прослушиватель CLASS, у меня есть исключение, но в контроллере я всегда могу использовать PersonFacade с @Autowired, но если я хочу использовать этот класс в другом классе, который не является контроллером, У меня есть эта проблема. Мне нужно добавить что-то в servelet-context.xml ??? Я разочарован этим. – TSW1985

+0

Я понимаю, что вы имеете в виду. Я попытался объяснить вам, что ваш контроллер управляется весной, потому что он аннотируется @Controller. Но ваш слушатель не аннотируется и не управляется весной. Так легко объяснить: вы можете вводить объекты только в инжектируемый объект. И ваш слушатель не вводится. – hiimjames

+0

Himjames, наконец, я поставил @Component в моем классе слушателя, и у меня такая же проблема. Я не знаю, что происходит. Всегда у меня такое же исключение. Вы знаете пример? – TSW1985

2

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

<context:component-scan base-package="com.gabrielglez.main" /> 

spring-context.xsd документация для component-scan говорит об этом (акцент мой).

Сканирует путь к классу для аннотированных компонентов, который будет , автоматически зарегистрированный как весенние бобы. По умолчанию создаваемые пружиной @Component, @Repository, @Service и @Controller будут обнаружены . Примечание: Этот тег подразумевает влияние тега «аннотацию-конфигурации» , активируя @Required, @Autowired, @PostConstruct, @PreDestroy, @Resource, @PersistenceContext и @PersistenceUnit аннотаций в классах компонент, который как правило, желательно для автообнаруженных компонентов (без внешней конфигурации ). Отключите атрибут 'annotation-config' до , чтобы отключить это поведение по умолчанию, например, чтобы использовать пользовательские определения BeanPostProcessor для обработки этих аннотаций.Примечание: Вы можете использовать заполнители в путях пакетов, но разрешены только в отношении свойств системы (аналогично путям ресурсов). Сканирование компонента приводит к регистрации нового определения bean-компонента; Spring's PropertyPlaceholderConfigurer применит к этим определениям бобов точно так же, как и для обычных определений bean-компонентов, но он не будет применяться к настройкам сканирования компонентов . См Javadoc для org.springframework.context.annotation.ComponentScan информации по альтернативам на основе кода для самонастройки компонентного сканирования

+0

Хорошо, как я могу исправить проблему? Благодарю. Что такое анотация? – TSW1985

+0

Это любая из аннотаций, которые я выделил. Посмотрите на свой другой класс, он имеет аннотацию '@ Service', применяемую к нему на уровне класса, который он сканирует. Вам нужно добавить какие-либо из этих аннотаций в свой класс, а затем ваш «компонент-сканирование» подберет его, например, '@ Component'. – mkobit

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