我想将WAR部署到Jetty 8. WAR包含一个简单的servlet,它通过CDI(Weld)注入了一个依赖项。
我在网上找到的所有示例/问题似乎只涉及嵌入式Jetty - 没有关于只使用Jetty作为外部servlet容器。
我已尽最大努力了解这些部件如何组合在一起,但注射似乎并未发生,即使系统说一切都是可以注射的。
我的META-INF中有一个裸 beans.xml 。
我的pom.xml,jetty-context.xml + jetty-env(在我的WEB-INF中),servlet,injectee实现+实现:
战争结束后,一切似乎都没问题:
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!!!!!!
!!!!!!!!!!!!!!
...当我尝试访问servlet第41行的注入时,我得到一个空指针。
我错过了一些明显的东西吗? Weld告诉我CDI的一切都很好......但是没有任何东西出现在那里。
编辑:我也试过这个,一切都与Jetty 7.6.9.v20130131一致(Weld支持,根据文档)
干杯,感谢您提供的任何见解。
答案 0 :(得分:0)
您正在从重写的Servlet.init()方法中调用Greeter
。这意味着此时servlet尚未初始化。来自Javadoc -
由servlet容器调用,以向servlet指示servlet正在投入使用。
servlet容器在实例化servlet后只调用一次init方法。在servlet可以接收任何请求之前,init方法必须成功完成。
现在,由于您没有为Greeter
声明范围,因此它自动为@Dependent
范围。因此,尽管@Dependent
范围始终处于活动状态,但依赖对象的生命周期与它们注入的实例绑定在一起,换句话说,它们本身不能存在。请参阅CDI规范的part。
也就是说,所有其他正常范围仅在Sevlet.serice()方法期间有效。因此,在Servlet完全初始化之前,您无法注入任何内容。请参阅CDI规范的part。
结论 - 尝试从服务方法调用您的Greeter
,如果我没有弄错的话,您只能使用实际请求。希望这有帮助!