0

我想将 WAR 部署到 Jetty 8。WAR 包含一个简单的 servlet,该 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 支持)

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

4

1 回答 1

0

您正在Greeter从覆盖的 Servlet.init() 方法中调用您的方法。这意味着此时 servlet 尚未初始化。从Javadoc -

由 servlet 容器调用以向 servlet 指示 servlet 正在投入使用。

servlet 容器在实例化 servlet 后恰好调用一次 init 方法。init 方法必须成功完成,servlet 才能接收任何请求。

现在,由于您没有为您的Greeter它声明范围,因此它自动具有@Dependent范围。因此,虽然@Dependent作用域始终处于活动状态,但依赖对象的生命周期与注入它们的实例绑定在一起,换句话说,它们不能单独存在。请参阅 CDI 规范的这一部分

也就是说,所有其他正常范围仅在Sevlet.serice()方法期间处于活动状态。因此,在 Servlet 完全初始化之前,您不能注入任何东西。请参阅 CDI 规范的这一部分

结论 - 尝试从服务方法调用你Greeter,如果我没记错的话,你只能用实际请求来做。希望这可以帮助!

于 2013-03-09T00:51:55.553 回答