使用する必要があるフレームワークの制約のため、既存のオブジェクトインスタンスに注入する必要があります(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によって作成ないで、コンストラクタは何の違いを作るべきではありませんので)
あなたの '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おそらくあなたはそれに切り替えることを検討するでしょうか? –
これは私の 'IgnorantCreationalContext'ですhttps://gist.github.com/t3chris/36d627528b5d059a272afd4ed8ccd148 私もDeltaspikeで試しましたが、同じ結果を見た' @ Inject'は動作しますが、 '@ EJB'はnull値のままです。 – t3chris
@JohnAment:元の質問を更新しました。 CDIがデフォルトコンストラクタの不足を無視するような方法はありますか? – t3chris