3

@ConversationScoped を使用している CDI Bean があります。Conversation オブジェクトに対して @Inject を実行しようとすると、NPE が発生します。

  @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 ファイル (空ですが) があります。例外は次のようになります。

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)
4

2 に答える 2

9

を使用して CDI Bean を作成したりnew、あらゆる種類の初期化ロジックにコンストラクターを使用したりしないでください。

この背後にある理由は、CDI Bean (EJB、Spring Bean、JSF Bean など) には独立したライフサイクルがあり、関連するコンテナーによって管理されるためです。いつ (およびどのくらいの頻度で)new呼び出されるかについての "従来の" 理解に頼ることはできません。プロデューサーを使用して新しい Bean を作成し、作成@PostConstruct後にロジックを実行するために使用します。

これにより、CDI を使い始めることができます。さらに質問を投稿してください:)

于 2012-09-11T11:57:56.120 に答える
0

Jan が言うように、コンストラクターにロジックを追加しています。インジェクションは、コンストラクターが呼び出されるまで発生しません。

于 2012-09-11T21:08:22.167 に答える