I hope you don't mind Spring-related questions.
How can I primarily use Spring to wire my objects and delegate to CDI (e.g. BeanManager) for objects that could not be found in the Spring context? In my scenario I would like to raise CDI events from inside a Spring bean:
I have the following dependency in my (spring-managed) bean:
@Inject Event<MyDomainObject> createdEvent;
If Spring does not find any candidate for wiring, I would like to fallback to a different mechanism that returns the bean to be injected. I tried to get an InjectionTarget as shown below, but I don't really know what to do with it now
// using a similar signature as spring's resolution mechanism
// mostly ignored
<T> T resolveViaCdi(DependencyDescriptor descriptor, Class<T> type,
String beanName, Set<String> autowiredBeanNames,
TypeConverter typeConverter) {
final Field f = descriptor.getField();
if (f == null) {
return null; // currently only supporting fields
}
AnnotatedTypeBuilder<T> builder = new AnnotatedTypeBuilder<T>();
builder.setJavaClass((Class<T>) f.getDeclaringClass());
for (Annotation a : descriptor.getAnnotations()) {
if (isQualifier(a)) {
builder.addToField(f, a);
}
}
AnnotatedType<T> t = builder.create();
InjectionTarget<T> ij = getBeanManager().fireProcessInjectionTarget(at);
// do something with this target to receive the bean to be injected
}
private WeldManager getBeanManager() {
if (beanManager == null) {
beanManager = (WeldManager) new BeanManagerLocator().getBeanManager();
}
return beanManager;
}
Is this the right way? What can I do with this target, or should I use something else? I hope someone can help me here.
Are there any news on a Spring extension to Weld or Seam 3? Any example code? I remember spring integration being planned for 3.1, but found no update since.
Thank you,
Kariem