3

CDI Bean があり、この Bean の 1 つのメソッドにインターセプターが追加されています。この Bean にデフォルトのコンストラクターがない場合 (コンストラクター インジェクションを使用します)。実行時に例外が発生します

java.lang.Class.newInstance0(Class.java:357)
java.lang.Class.newInstance(Class.java:325)
org.apache.webbeans.proxy.javassist.JavassistFactory.createProxy(JavassistFactory.java:79)
org.apache.webbeans.proxy.ProxyFactory.createProxy(ProxyFactory.java:241)
org.apache.webbeans.proxy.ProxyFactory.createDependentScopedBeanProxy(ProxyFactory.java:412)
org.apache.webbeans.component.AbstractInjectionTargetBean.createDefaultInstance(AbstractInjectionTargetBean.java:140)
org.apache.webbeans.component.AbstractInjectionTargetBean.createInstance(AbstractInjectionTargetBean.java:116)
org.apache.webbeans.component.AbstractOwbBean.createNewInstance(AbstractOwbBean.java:233)
org.apache.webbeans.portable.creation.AbstractProducer.produce(AbstractProducer.java:77)
org.apache.webbeans.component.InjectionTargetWrapper.produce(InjectionTargetWrapper.java:136)

この Bean にデフォルトのコンストラクターを追加するか、インターセプターを削除すると、問題ありません。実際、フィールド注入を使用してこの問題を処理できます。

しかし、知りたいのは、デフォルトのコンストラクターを追加すると、この Bean には 2 つのコンストラクターがあることを意味し@Injectます。この場合 (インターセプターを使用)、コンテナーはインスタンスを 2 回作成しますか?

編集: Tomee1.5 を使用しています。WebShpere8.5 は Tomee1.5 と同じで、GlassFish3.1.2 にはこの問題はないようです。

編集: Tomee User Forum で、CDI コンテナーは、Bean の @Inject 注釈付き ct を呼び出しますが、プロキシの作成にはデフォルトの ct を使用するという回答を見つけました。したがって、コンストラクターインジェクションを使用する場合は、プロキシ可能にするためのデフォルトのコンストラクターも必要であることを意味すると思います。

編集:

  1. http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1443によると 、Bean がデフォルトのスコープ @Dependent を持たない限り、コンテナーは注入されたすべての参照を Bean に間接的に転送する必要があります。プロキシ オブジェクト。

  2. //openejb.979440.n4.nabble.com/RequestScoped-CDI-constructor-td4661541.html によると、CDI コンテナーは Bean の @Inject アノテーション付きコンストラクターを呼び出しますが、プロキシの作成にはデフォルトのコンストラクターを使用します。したがって、すべての 'NormalScoped' (@RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped) Bean には常にプロキシされるため、デフォルトのコンストラクターが必要です。

  3. Bean がインターセプターを使用する場合、エラー メッセージによると、OpenWebBean は Proxy を使用してインターセプターを処理するため、インターセプトされたクラスにはデフォルトの構成が必要です。ただし、Weld はインターセプターとデコレーターにサブクラスを使用します。https://issues.jboss.org/browse/WELD-437?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel サブクラス化ソリューションはプロキシ化よりも優れています。多くの問題を処理する必要がないためです。例: 引数のないコンストラクターのないインターセプトされたクラスと、プロキシ化されたインスタンスでのフィールド アクセス。したがって、Tomee と Websphere を使用する場合、デフォルトの ct が必要ですが、GlassFish には必要ありません。

    brandizzi に感謝します。ここでの最初の質問です。ご協力ありがとうございました。そして、私は自分の質問に答えることができず、評判が10でないと2つ以上のリンクを投稿できないようですので、ここで編集しました.

4

1 に答える 1

0

CDI 仕様に記載されているように、バインドされたインターセプターを持つ CDI Bean はプロキシ可能である必要があります。これはunproxyable Bean typesで定義されています。さらに、proxyble Bean は、パラメーターのない非プライベート コンストラクターを持つクラスであると述べています。

于 2014-07-30T07:42:08.550 に答える