这是我第一次与GAE合作,我正在尝试让CDI工作。长话短说:我的 servlet 中的 @Inject
字段没有被注入(它总是null
(。
我正在使用 Eclipse 并在 GAE SDK 中包含的本地测试服务器上调试应用程序(该服务器也由 Eclipse 启动(。当我访问 localhost
上的 servlet 时,我得到了 someService
的空指针异常。我还输出了 someService
的值以验证它是否真的null
,确实如此。
编辑:当我在注入点添加@Named("skldjfx")
限定符时,Weld抱怨依赖项不满意(在验证阶段(,所以这是一个好兆头。但是,该字段仍然始终null
。
Servlet:
public class BlogServlet extends HttpServlet {
@Inject private SomeService someService;
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.getWriter().println("Hello. " + someService.getSomeValue());
//
// always null
}
}
SomeService
类:
@ApplicationScoped
public class SomeService {
private String someValue = "some value";
public String getSomeValue() {
return someValue;
}
}
我已经在web.xml
中配置了 Weld 的Listener
:
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
侦听器已正确加载,因为它记录了其初始化消息:org.jboss.weld.environment.servlet.Listener contextInitialized
。
我在war/WEB-INF
和war/META-INF
中都包含了(一个空的(beans.xml
。我也在没有META-INF
的情况下尝试过.也许beans.xml
没有处理?WEB-INF
文件夹中的其他内容(如 web.xml
(将得到正确处理。
如何验证beans.xml
是否被处理和/或修复SomeService
没有注射?
将 CDI 与 GAE 一起使用,因为 GAE 的 Jetty fork 忽略了 jetty-web.xml
,这是指定BeanManager
所必需的。请参阅此链接和此链接。非常奇怪的 GAE 不支持使用 CDI。
请注意,这些链接真的很旧,但到目前为止,我还没有找到任何相反的证据。
无论如何,我的下一步将是使用Google自己的依赖注入框架Guice。此处介绍了将其与 GAE 一起使用。不过我更喜欢CDI。