Introduction
Depuis la version 3 des EJB il est possible d’utiliser l’annotation @Interceptor afin de d’activer le support de Autowiring dans Spring
@Interceptors(SpringBeanAutowiringInterceptor.class)
Cependant cela fonctionne uniquement si l’on à un unique fichier contexte Spring qui doit se nommer “beanRefContext.xml“.
Dans le cas d’application n/tier il est necessaire de mettre en place quelques lignes de code afin de pouvoir charger plusieurs contexte.
Explication :
Habituellement nous utilisons l’interceptor de Spring : SpringBeanAutowiringInterceptor
Il nous faut alors surcharger cette classe de la maniere suivante :
public class AppSpringBeanAutowiringInterceptor extends SpringBeanAutowiringInterceptor {
private static final String[] CONTEXT_FILE = new String[]{
"classpath*:/applicationContext-dao.xml", "classpath*:/applicationContext-metier.xml"};
@Override
protected BeanFactory getBeanFactory(Object o) {
return SpringBeanFactoryManager.getBeanFactory();
}
private static class SpringBeanFactoryManager {
private static final SpringBeanFactoryManager instance =
new SpringBeanFactoryManager();
private final ClassPathXmlApplicationContext context;
private SpringBeanFactoryManager() {
// singleton
context = new ClassPathXmlApplicationContext(CONTEXT_FILE);
}
public static BeanFactory getBeanFactory() {
return instance.context.getBeanFactory();
}
}
}
Une fois cette classe mise en place on peut alors l’utiliser dans chaque EJB afin d’accéder à nos contextes Spring.
@Interceptors(AppSpringBeanAutowiringInterceptor.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Stateless(mappedName="ServiceAddUserEJB", name="ServiceAddUserEJB")
public class AddUserEjbImpl implements IAddUser {
}