0

こんにちは、次の修飾子タイプが定義されています..

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.FIELD })
public @interface SortAndFilterType {

/**
 * The value for the sort and filter.
 *
 * @return the sort and filter type value.
 */
String value();
}

そしてそれから2つの実装。

@SortAndFilterType("Users")
public class UserSortAndFilterProviderImpl implements SortAndFilterProvider<Field, User>       {}

@SortAndFilterType("ReportsList")
public class ReportListSortAndFilterProviderImpl implements SortAndFilterProvider<Field, ReportList> {}

そして、私はクライアントから..として注入しています

@Inject
@SortAndFilterType("Users")
private SortAndFilterProvider mSortAndFilterProvider;

実行時にすべてが正常に動作します..

しかし、単体テストを実行すると問題が発生します..

私は以下の例外を取得しています..

org.jboss.weld.exceptions.DeploymentException: WELD-001408: 注入ポイント [BackedAnnotatedField] @Inject @SortAndFilterType プライベート com.collabnet.ctf.saturn.client.apps.users.ChangeUsersStatus. mSortAndFilterProvider

このような単体テストからこれを呼び出します.. @RunWith(CdiRunner.class) で実行されます

@Produces
@SortAndFilterType("Users")
@Mock
private SortAndFilterProvider mSortAndFilterProvider;

ここで何がうまくいかないのですか?

4

2 に答える 2

1

CDI の 1 つの良い点 (これはここでの問題です) は、そのタイプ セーフな解決では、パラメーター化された型のパラメーターが考慮されることです。言い換えれば:「CDIで型消去なし」 仕様は、パラメータ化された型の解決について非常に詳細です:

パラメータ化された Bean タイプは、パラメータ化された必須タイプに割り当て可能であると見なされます。

  • 必要な型パラメーターと Bean 型パラメーターは、同じ生の型を持つ実際の型であり、型がパラメーター化されている場合、これらの規則に従って、Bean 型パラメーターを必要な型パラメーターに割り当てることができます。または

  • 必要な型パラメーターがワイルドカードであり、Bean 型パラメーターが実際の型であり、実際の型がワイルドカードの上限 (存在する場合) に割り当て可能であり、ワイルドカードの下限 (存在する場合) から割り当て可能である、または

  • 必要な型パラメーターはワイルドカードであり、Bean 型パラメーターは型変数であり、型変数の上限はワイルドカードの上限 (存在する場合) に割り当て可能、または上限から割り当て可能であり、下限 (存在する場合) から割り当て可能です。ワイルドカードの、または

  • 必要な型パラメーターが実際の型であり、Bean 型パラメーターが型変数であり、実際の型が型変数の上限 (存在する場合) に割り当て可能である、または

  • 必要な型パラメーターと Bean 型パラメーターは両方とも型変数であり、必要な型パラメーターの上限は、Bean 型パラメーターの上限 (存在する場合) に割り当てることができます。

元のテキストはhttp://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#assignable_parametersで読むことができます。

現在、Weld 1.x はこの点で十分に厳密ではなく、パラメーター化された型を生の型に割り当てることを受け入れています。これがおそらく実行時に問題がなく (たとえば JBoss AS 7.x で実行)、テストでこの問題が発生する理由です (cdi-runner はおそらく Weld 2.x を使用しています)。はい、ここで推測していますが、間違っている可能性があります。そのため、質問で使用しているフレームワークのバージョンを提供することは常に良いことです。

とにかく、注入ポイントをに変更して問題を解決する必要があります

@Inject
@SortAndFilterType("Users")
private SortAndFilterProvider<Field,?> mSortAndFilterProvider; 

仕様を尊重し、Weld 1.x および 2.x で動作します。

ちなみに、次の間にあいまいさがないため、おそらく修飾子は必要ありません。

@Inject
private SortAndFilterProvider<Field,User> mSortAndFilterProvider1;

@Inject
private SortAndFilterProvider<Field,ReportList> mSortAndFilterProvider2;
于 2014-09-17T09:49:14.393 に答える
0

Hi that's Exactly the Problem. and my Runtime uses Jboss 7 and the Test Environment uses CDI 2.x.

After adding the type parameters to the Injection point it works perfectly fine.

Thanks a lot.

于 2014-09-17T15:04:46.913 に答える