2013-03-08 7 views
0

Я хочу развернуть WAR для Jetty 8. WAR содержит простой сервлет, в который введена зависимость через CDI (Weld).Сервлет на Jetty 8 (не встроенный!) + Сварка для CDI

Все примеры/вопросы, которые я нашел в Интернете, похоже, имеют дело со встроенным Jetty - ничего о том, чтобы просто использовать Jetty в качестве внешнего контейнера сервлета.

Я все придумал, насколько я знаю, как эти части подходят друг другу, но инъекция, похоже, не происходит, даже если система говорит, что все в порядке для инъекций.

У меня голый beans.xml в моей META-INF.

Мой pom.xml, молы-context.xml + Пристань-ENV (в моем WEB-INF), сервлет, реализация injectee + реализация:

http://pastebin.com/qh7pGCn5

Когда развертывается война, все сначала кажется, нормально:

Mar 08, 2013 3:38:42 PM org.jboss.weld.bootstrap.WeldBootstrap <clinit> INFO: WELD-000900 1.1.10 (Final) Mar 08, 2013 3:38:42 PM org.jboss.weld.bootstrap.WeldBootstrap startContainer INFO: WELD-000101 Transactional services not available. Injection of @Inject Use rTransaction not available. Transactional observers will be invoked synchronousl y. Mar 08, 2013 3:38:42 PM org.jboss.weld.environment.jetty.JettyPost72Container in itialize INFO: Jetty7 detected, JSR-299 injection will be available in Listeners, Servlet s and Filters. init init init init init init init init init init init init init init init!!!!!! !!!!!!!!!!!!!!

... тогда я получаю пустой указатель, когда он пытается получить доступ к injectee на линии 41 сервлета.

Я пропустил что-то очевидное? Сэлд говорит мне, что все хорошо для CDI .. но ничего не появляется.

редактировать: Я также попытался это все, выровненной к Jetty 7.6.9.v20130131 (который поддерживается Weld, в соответствии с документацией)

Приветствия, оценить любое представление вы можете предоставить.

ответ

0

Вы вызываете свой Greeter из переопределенного метода Servlet.init(). Это означает, что сервлет еще не инициализирован в этой точке. От Javadoc -

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

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

Теперь, так как вы не объявляете рамки для вашего Greeter он автоматически из @Dependent сферы. Поэтому, хотя область всегда активна, жизненный цикл зависимых объектов связан с экземпляром, в который они вводятся, другими словами, они не могут существовать сами по себе. См. Это part спецификации CDI.

При этом все другие нормальные области действия действуют только во время метода Sevlet.serice(). Следовательно, вы не можете вводить ничего, пока Servlet не будет полностью инициализирован. См. Это part спецификации CDI.

Заключение - попробуйте позвонить по своему методу Greeter, который вы можете делать только с фактическим запросом, если я не ошибаюсь. Надеюсь это поможет!

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