Jetty 8上的Servlet(非嵌入式!)+ CDI焊接

时间:2013-03-08 21:14:56

标签: servlets jetty cdi weld

我想将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实现+实现:

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!!!!!! !!!!!!!!!!!!!!

...当我尝试访问servlet第41行的注入时,我得到一个空指针。

我错过了一些明显的东西吗? Weld告诉我CDI的一切都很好......但是没有任何东西出现在那里。

编辑:我也试过这个,一切都与Jetty 7.6.9.v20130131一致(Weld支持,根据文档)

干杯,感谢您提供的任何见解。

1 个答案:

答案 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,如果我没有弄错的话,您只能使用实际请求。希望这有帮助!