2017-11-16 17 views
1

マイプロジェクトtechstackは次のようになります。このようなJavaEEの8、Wildflyは、JBoss と構造:JavaEE 8に同じ名前の2つのインタフェースを挿入できますか?

companycontext 
    - company 
    - workplace 
    - employee 
    - web (beans.xml here) 

私は両方会社職場プロジェクトでEmployeeAdapterインタフェースを持っています。 CDIは、すべてのプロジェクト内のすべてのBeanを発見するでしょう のでので、私は今のところエラー

A component named 'EmployeeAdapterImpl' is already defined in this module 

を得るでしょう私の解決策であるような名前:ComEmployeeAdapterWorkEmployeeAdapter ... は、私がのようなものを使用することができます@

// Implement 
@Stateless @Named("company") 
EmployeeAdapterImpl implement EmployeeAdapter 

// Using 
@Inject @Named("company") private EmployeeAdapter 

// Implement 
@Stateless @Named("workplace") 
EmployeeAdapterImpl implement EmployeeAdapter 

// Using 
@Inject @Named("workplace") private EmployeeAdapter 

という名前の私はそれが私たちのアダプターに名前を付けるためのルールよりもはるかに良いことだと思います。

ありがとうございました。

+0

ご迷惑をおかけして申し訳ありません。そしてそれがうまくいかないので、各プロジェクトにEmployeeAdapterインターフェイスがあることに注意してください。 –

+1

クラスの名前を異なるものにする必要があります。 'CompanyEmployeeAdapterImpl'を呼び出し、修飾子を付けて次のように使用します。' @Qualifier( "CompanyEmployeeAdapterImpl")private EmployeeAdapter a'' – Lino

+0

そして他のクラスと同様に – Lino

答えて

2

これはEJBの問題ではなく、CDIの問題です。

CDI Bean型は完全修飾クラス名で定義されているため、異なるパッケージ内に同じ名前のBeanを2つ持つことに問題はありません。

2つのEmployeeAdapterImpl BeanがステートレスセッションBeanであるため、EJBコンテナはそれらのJNDI名を生成します。あなたは、生成された名前の一つは、フォーム

java:module/EmployeeAdapterImpl 

だけの単純なクラス名を取っているので、これはあなたのケースでは、競合を引き起こしている

16:09:39.812 [MSC service thread 1-8] INFO org.jboss.as.ejb3.deployment - WFLYEJB0473: JNDI bindings for session bean named 'Foo' in deployment unit 'deployment "myapp.war"' are as follows: 

のようなメッセージでWildFlyログでそれらを見ることができます。

@Stateless注釈のnameまたはmappedName要素を試してみるとよいでしょう。

+0

これは元の役職。 CDIはここで問題を引き起こすべきではありませんが、EJBは問題になりません。別のJNDIを生成させることが一つの方法です。 – Siliarus

+0

@Stateless(name = "CompanyEmployeeAdapterImpl")では、まだルールに名前を付ける必要があります。私はbean name:company.EmployeeAdapterImplのパッケージのようなものを望んでいます。ご説明をいただき、ありがとうございます。 –

関連する問題