質問
溶接部1.1.13.7℃での試験では......
揮発性の何かに射撃すると言ってみましょう。私が注入点を所有している豆が変化イベントを受け取ることを望んでいるように変更されるという財産のようなもの。 CDI拡張機能を作成することについて考えました。
ProcessAntatedTypeイベントをキャッチし、フィールドインジェクションポイントにカスタムアノテーションを持つすべてのフィールドを探しています。
<T> void pat(@Observes ProcessAnnotatedType<T> event, BeanManager bm) {
final AnnotatedType<T> target = event.getAnnotatedType();
for (AnnotatedField<? super T> field : target.getFields())
if (field.isAnnotationPresent(Value.class)) { // ignore that I don't check @Inject here for the moment
CtClass wrapper = pool.get(target.getJavaClass().getName());
ConstPool cp = wrapper.getClassFile().getConstPool();
CtMethod m = CtNewMethod.make(....)
....
wrapper.addMethod(m);
event.setAnnotatedType(bm.createAnnotatedType(wrapper.toClass()));
}
}
.
その後、フィールドのすべての射出点を把握し、その下にあるウェルドフィールドを「ラッパー」タイプに対応する新しいフィールドに置き換えた。それ以外の場合、Bean検証は失敗します。
しかし、これは起動時の設定のみで動作するために、ArquillianがBean Managerを使用して私の "ラップ"の1つを挿入するクラスを初期化します。 Bean ResolverがBeanを見つけるためのハッシュキーとしてタイプを使用するため、物事は失敗します。
基本的に、カスタムイベントを受信するための追加のメソッドを備えたCDIによって注釈付きクラス(Beanに作成されている)を「マスク」できるとは思わない。クールだっただろうがタイプはタイプです(すなわち、equals / hashcodeをプロキシまたは偽造する方法を理解する方法、または偽造する方法)。
解決
それを手に入れた。TyptionAfeAnResolverリゾルバ(少なくともCDI溶接実装)内の計算値関数(Google拡張)がスマートです。クラスを拡張するだけの場合:
CtClass wrapper = pool.makeClass(target.getJavaClass().getName()+"Proxy");
wrapper.setSuperclass(pool.get(target.getJavaClass().getName()));
.....
final AnnotatedType<T> other = bm.createAnnotatedType(wrapper
.toClass());
.
それからすべてがうまく機能します。テスト済みBeanでイベントをキャプチャします。コメントを使ってGistにコードを投稿します。
所属していません StackOverflow