首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Injection不适用于CDI bean

@Injection不适用于CDI bean
EN

Stack Overflow用户
提问于 2012-09-11 19:40:30
回答 2查看 10.6K关注 0票数 3

我有一个使用@ConversationScoped的CDI bean。当我试图为对话对象做一个@Inject时,我得到了一个NPE。

代码语言:javascript
复制
  @ConversationScoped
@Named("customerbean")
public class CustomerBean implements Serializable {

    @Inject
    private Conversation conversation;    

    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("ba");
    private EntityManager em;
    private Customer customer;
    boolean disabled;    

    public CustomerBean() {
        beginConversation();
        customer = new Customer();
        em = emf.createEntityManager();
        disabled = false;
    }

    private void beginConversation() {
        if (this.conversation.isTransient()) {
            this.conversation.begin();
            return;
        }
        throw new IllegalStateException();
    }

我在WEB-INF目录中有beans.xml文件(虽然是空的)。异常如下所示:

代码语言:javascript
复制
INFO: Exception when handling error trying to reset the response.
com.google.common.collect.ComputationException: java.lang.RuntimeException: java
.lang.NullPointerException
        at com.google.common.collect.ComputingConcurrentHashMap$ComputingMapAdap
ter.get(ComputingConcurrentHashMap.java:397)
        at org.jboss.weld.bean.proxy.ClientProxyProvider.getClientProxy(ClientPr
oxyProvider.java:102)
        at org.jboss.weld.el.AbstractWeldELResolver.lookup(AbstractWeldELResolve
r.java:115)
        at org.jboss.weld.el.AbstractWeldELResolver.getValue(AbstractWeldELResol
ver.java:96)
        at org.jboss.weld.environment.servlet.util.ForwardingELResolver.getValue
(ForwardingELResolver.java:49)
        at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
        at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELR
esolver.java:176)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-11 19:57:56

您不能使用new创建CDI bean,也不能为任何类型的初始化逻辑使用构造函数。

这背后的原因是CDI bean(如EJB、Spring bean、JSF bean)有一个独立的生命周期,并由相关的容器管理。您不能依赖于对何时(以及多频繁)调用new的“传统”理解。使用producers创建新的beans,并对创建后要执行的任何逻辑使用@PostConstruct

This应该会给你一个良好的开端。请随时发表进一步的问题:)

票数 9
EN

Stack Overflow用户

发布于 2012-09-12 05:08:22

正如Jan所说,您正在向构造函数中添加逻辑。直到构造函数被调用之后,注入才会发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12368888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档