In my last two posts (Circular Dependencies of Session Beans and Circular injection of Util Classes in EJB 3.0) I wrote, that it is possible to have circular dependencies between session beans via interceptors and manual EJB lookup. In this post I will sketch out how.
In the InjectionInterceptor we have to add the possibility to add the beans by mapping name:
protected void setBeans(final Object...beans) {
if(this.beans == null) {
this.beans = new ArrayList<Object>(beans.length);
}
this.beans.addAll(Arrays.asList(beans));
}
protected void setBeansFromMappingNames(final Class<?>... beanClasses) throws Exception {
if(this.beans == null) {
this.beans = new ArrayList<Object>(beanClasses.length);
}
final InitialContext ctx = new InitialContext();
for(final Class<?> beanClass : beanClasses) {
final LocalBinding localBinding = beanClass.getAnnotation(LocalBinding.class);
if(localBinding != null) {
this.beans.add(ctx.lookup(localBinding.jndiBinding()));
}
}
}
Then we have to annotate the beans with the annotation @LocalBinding. At last we have to change the interceptor implementation (called FooBarInterceptor this time):
public class FooBarInterceptor extends InjectionInterceptor {
@PostConstruct
@Override
protected void postConstruct(final InvocationContext ctx) throws Exception {
this.setBeansFromMappingNames(FooBean.class, BarBean.class);
this.setUtils(FooUtil.class, BarUtil.class);
super.postConstruct(ctx);
}
}
You may download the whole source in the project package inject-dependencies-0.0.3. The output should look like this:
17:19:59,319 SEVERE [FooBean] FooBean#foo(): de.jn.sandbox.ejb.injection.FooBean@4f3bc9e6 17:19:59,320 SEVERE [FooUtil] FooUtil#foo(String): de.jn.sandbox.ejb.injection.FooUtil@5e4443ad msg: this.fooUtil#foo(String) called from de.jn.sandbox.ejb.injection.FooBean@4f3bc9e6 17:19:59,320 SEVERE [BarUtil] BarUtil#bar(): de.jn.sandbox.ejb.injection.BarUtil@53b74334 msg: this.barUtil#bar(String) called from de.jn.sandbox.ejb.injection.FooUtil@5e4443ad 17:19:59,320 SEVERE [FooUtil] FooUtil#bar(String): de.jn.sandbox.ejb.injection.FooUtil@5e4443ad msg: this.fooUtil#bar(String) called from de.jn.sandbox.ejb.injection.BarUtil@53b74334 17:19:59,340 SEVERE [BarBean] BarBean#bar(): de.jn.sandbox.ejb.injection.BarBean@3f10a5ce, msg: this.bar#bar(String) called from de.jn.sandbox.ejb.injection.FooUtil@5e4443ad 17:19:59,349 SEVERE [FooBean] FooBean#bar(): de.jn.sandbox.ejb.injection.FooBean@5c4d9ecb, msg: this.foo#bar(String) called from de.jn.sandbox.ejb.injection.BarBean@3f10a5ce 17:19:59,357 SEVERE [BarBean] BarBean#bar(): de.jn.sandbox.ejb.injection.BarBean@3f10a5ce, msg: this.bar#bar(String) called from de.jn.sandbox.ejb.injection.FooBean@4f3bc9e6 17:19:59,357 SEVERE [FooBean] FooBean#bar(): de.jn.sandbox.ejb.injection.FooBean@5c4d9ecb, msg: this.foo#bar(String) called from de.jn.sandbox.ejb.injection.BarBean@3f10a5ce