Google App Engine上的Weld CDI:servlet中的注入没有发生

时间:2012-05-01 23:53:07

标签: google-app-engine java-ee cdi jboss-weld

这是我第一次与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;
    }
}

我在Listener中配置了Weld web.xml

<listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>

正确加载侦听器,因为它记录了初始化消息:org.jboss.weld.environment.servlet.Listener contextInitialized

我在beans.xmlwar/WEB-INF中都包含(空)war/META-INF。我还试过没有META-INF可能beans.xml未处理? WEB-INF文件夹中的其他内容(例如web.xml 正确处理。

如何验证处理beans.xml和/或修复SomeService是否未注入?

1 个答案:

答案 0 :(得分:0)

看起来无法使用带有GAE的CDI,因为GAE的Jetty分支忽略jetty-web.xml,这是指定BeanManager所必需的。请参阅this linkthis link。非常奇怪的GAE不支持使用CDI。

请注意,这些链接确实很旧,但到目前为止我还没有找到任何相反的证据。

无论如何,我的下一步将是使用谷歌自己的依赖注入框架Guice。将其与GAE一起使用描述here。我更喜欢CDI。