2016-06-19 9 views
0

使用する必要があるフレームワークの制約のため、既存のオブジェクトインスタンスに注入する必要があります(CDI自体では通常通り作成できません) 。私の注入点は、@EJBまたは@Injectのいずれかでマークされています。私は、JBoss EAP 7.0はJava EE 7とCDI 1.1だけで同じことをしようとした場合CDI既存のオブジェクトインスタンスへの注入 - CDI 1.0では動作しますが、CDI 1.1では動作しません

public class DispatcherUtils { 

    public static <T> void inject(T anObject) { 
     BeanManager beanManager = getBeanManager(); 
     Class<T> objClass = (Class<T>) anObject.getClass(); 
     AnnotatedType<T> annotatedType = beanManager.createAnnotatedType(objClass); 
     InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType); 
     CreationalContext<T> context = new IgnorantCreationalContext<>(); 
     injectionTarget.inject(anObject, context); 
     injectionTarget.postConstruct(anObject); 
    } 

    private static BeanManager getBeanManager() { 
     try { 
      return (BeanManager) InitialContext.doLookup("java:comp/BeanManager"); 
     } catch (final NamingException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 

:JBossのEAP 6.4はJava EE 6で

とCDI 1.0これは次のコードと完全にうまく働い@Injectと記されている注入点は対象物に注入され、@EJBとマークされた注入点は注入されない(その値はヌルのままである)。

私はそれがなぜ理解できません。

JBoss EAP 7.0、Java EE 7、およびCDI 1.1を使用して既存のオブジェクトに注入する方法はありますか?また、@EJB注入ポイントも設定されていますか?


アップデート、2016年6月19日、20時11分

私は上記のパターンがある限り、私はに注入したいオブジェクトを引数なしのコンストラクタを持っているように動作することを発見しました。

例 - この作品:

public class ExampleBean { 

    private Dispatcher dispatcher; 

    @Inject 
    private SomeCdiBean someCdiBean; 

    @EJB 
    private SomeEjbService someEjbService; 

    public ExampleBean() { 
    } 

    public ExampleBean(Dispatcher dispatcher) { 
     this.dispatcher = dispatcher; 
    } 

} 

このながらを動作しません:

public class ExampleBean { 

    private Dispatcher dispatcher; 

    @Inject 
    private SomeCdiBean someCdiBean; 

    @EJB 
    private SomeEjbService someEjbService; 

    public ExampleBean(Dispatcher dispatcher) { 
     this.dispatcher = dispatcher; 
    } 

} 

なぜこのような場合のデフォルトコンストラクタの存在のためにCDIチェックしていますか? (注意:BeanはCDIによって作成ないで、コンストラクタは何の違いを作るべきではありませんので)

+0

あなたの 'IgnorantCreationalContext'はどのように見えますか? DeltaSpikeは、同じ機能を持っており、それがWildfly 10で正常に動作します:https://github.com/apache/deltaspike/blob/master/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/ api/provider/BeanProvider.java#L448おそらくあなたはそれに切り替えることを検討するでしょうか? –

+0

これは私の 'IgnorantCreationalContext'ですhttps://gist.github.com/t3chris/36d627528b5d059a272afd4ed8ccd148 私もDeltaspikeで試しましたが、同じ結果を見た' @ Inject'は動作しますが、 '@ EJB'はnull値のままです。 – t3chris

+0

@JohnAment:元の質問を更新しました。 CDIがデフォルトコンストラクタの不足を無視するような方法はありますか? – t3chris

答えて

0

可能性のある問題は、あなたのExampleBeanなし引数なしのコンストラクタがmanaged bean考えられていない可能性があります。また、インテグレータ(Wildfly、EAP、glassfishな​​ど)はmanaged beansにEEリソース注入(@EJBがEEリソース注入)のみを提供できます。 Weld docから引用

積分器が過剰と、上記溶接によって提供される追加のフィールドまたはメソッド注入を提供するInjectionServicesを使用することができます。 Java EE環境への統合では、InjectionServicesを使用してマネージドBeanにEEリソースインジェクションを提供することがあります。

ExampleBeanmanaged beanなく引数なしのコンストラクタを使用するようにするには、@Injectで注釈を付けコンストラクタを宣言する必要があります。

私はここで野生の推測をしていますが、EAP 6とCDI 1.0と一緒に働いた理由を本当に確信できません。

さらに私の知る限り、記録のためのもう1つの注釈は、CDI 1.2(1.1ではなく)を含んでいます。

+0

ExampleBeanに関して、マネージドBeanではないと言っても、私は全く同意します。 しかし、これまでのところ、単にうまくいくのでそのままにしていました。 私は今、私たちはそれを管理対象Bean(それはEAP 6.xでやったよう)のように見えないインスタンスに注入することで結構ですCDIエンジンに伝えることを可能にするソリューションを求めるでしょう。そのBeanを事前に正しく作成しているので、問題はありません。 CDI 1.2に関しては、もちろん正しいです、私のせいです。 – t3chris

関連する問題