2014-03-10 3 views
3

Я не могу получить поля моего сервлета @AutoWire; они заканчиваются нулевым. У меня есть чистая конфигурация, настроенная на аннотацию (без файлов XML). Мой сервлет выглядит следующим образом:Ошибка @AutoWire участника в @WebServlet

@WebServlet("/service") 
public 
class 
SatDBHessianServlet 
    extends HttpServlet 
{ 
    @Autowired protected NewsItemDAO    mNewsItemDAO; 
} 

Других @AutoWired вещь, кажется, работает хорошо, как @Service объектов и @Repository объектов. Но не этот, и я не могу понять, почему. Я даже попытался добавить свой пакет в список ComponentScan (basePackages) для других моих классов.

Дополнительная информация:

Я добавил следующее инициализации моего сервлета() метод, и все, казалось проволокой правильно, но я запутался, почему весна не может подключить его без того, ,

SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, inConfig.getServletContext()); 
+0

Возможный дубликат [Почему моя весна @Полученное поле null?] (Http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null) – chrylis

+0

Ну, этот вопрос имеет дело с объектами, созданными с помощью нового, что не то, что я здесь делаю, хотя, поскольку Spring не создает его, я думаю, это может быть эквивалентно. Я попробую их решение с @Configurable. – Rick

+0

Ситуация та же; 'new' вызывается тем, что контейнер Spring не знает для обработки (в данном случае непосредственно контейнером сервлета). Почему вы вручную пишете сервлет вместо поддержки фреймворка? – chrylis

ответ

4

Servlet являются веб-компоненты, которые не создаются с помощью Spring контейнера, основанные на этом жизненном цикле не управляется контейнером и много вещей, которые весной обеспечивает такие как autowired или аспект не может бежать от них.

Необходимо указать весеннему контейнеру, что компонент был создан вне контейнера IoC и должен быть его частью.

И как API сказал SpringBeanAutowiringSupport для:

Удобный базовый класс для самостоятельного автоматического связывания классов, которые получает построен в Спринг на основе веб-приложения

Этот общий сервлет базовый класс имеет не зависимо от концепции Spring ApplicationContext.

Существует еще один способ указать, создаваемые пружинный контейнер сервлет с использованием интерфейса

+0

Как я уже сказал, я добавил его в ComponentScan (basePackages), поэтому Spring должен был его найти. Разве это не так, как это работает? – Rick

+0

Совсем нет Componentcan работает с @Component и дополнительными аннотациями к стереотипам, аннотация WebServlet не является одним из них, поэтому Spring-контейнер не знает и не контролирует его жизненный цикл. – Koitoer

1

Spring MVC использует DispatcherServlet для обработки всех запросов в среде Servlet. DispatcherServlet соответственно пересылает запросы к соответствующему классу @Controller (если есть) на основе @RequestMapping этого класса и/или его методов.

Что происходит в вашем сервлете, так это то, что он не управляется весной (но контейнером Servlet) и там, где не происходит инъекций зависимостей.

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