Google App Engine 上的 Weld CDI:未在 servlet 中注入



这是我第一次与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-INFwar/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。

最新更新