2013-08-05 3 views
1

У меня есть следующий фрагмент кода, который я смоделированный на this answer:Потребители инъекционных Весна @Resource в сервлет

public class DeployerServlet extends HttpServlet { 
    @Resource 
    Engine engine; 

    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
     SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext()); 
    } 

    // ... 
} 

Но сервлет даже не правильно инстанцирован. При создании экземпляра Tomcat пытается найти имя com.example.DeployerServlet/engine в JNDI, что приводит к исключению,

SEVERE: Allocate exception for servlet Deploy Servlet 
javax.naming.NameNotFoundException: Name com.example.DeployerServlet is not bound in this Context 

Итак, что является рекомендуемым способом, чтобы придать Spring боб в сервлет?

+0

Это зависит. Не возражаете, если вы получаете зависимости от весенних классов в вашем сервлете? – mael

+0

Я уже отлично справился с 'SpringBeanAutowiringSupport' в моем сервлете, так что, я думаю, не проблема. Но было бы неплохо иметь декларативный '@ Resource' вместо прямого вызова' applicationContext.getBean() '. – Saintali

+1

Поскольку Контейнер отвечает за инициализацию сервлета, вы вынуждены использовать 'SpringBeanAutowiringSupport' для достижения того, чего хотите. Весна не управляется сервлетом. –

ответ

1

Анкета @Resource - это JavaEE element. Он используется для объявления ссылки на ресурс. Хотя Spring может использовать его так же, как и с @Inject и @Autowired, в этом случае сначала выполняется сервлет-контейнер. Просто замените @Resource на @Autowired.

+0

Обратите внимание, что существует небольшая разница между '@ Autowired' и' @ Resource': позднее связывает beans по имени, затем возвращается к привязке по типу; первая привязывается исключительно по типу, используя имя (как указано в аннотации '@ Qualifier ') только как подсказка (http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s11. HTML). – Jerzyna

0

Кажется, что ваша сборка выполнена неправильно. очистите проект и перестройте его. Ваша проблема решит

+0

Я использую Maven и постоянно получаю эту ошибку в нескольких сборках. Также я не вижу, как это может быть проблемой сборки, поскольку, очевидно, нет такого имени JNDI. – Saintali

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