Ejb avec contexte spring multiple

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 {
}

About Sébastien Renno