Considering Spring’s 5.x baseline and CDI’s baseline 2.x, what more viable options should I consider to integrate them into a project with JSF 2.3, since JSF 2.3 is coupled with the CDI? Bridges? Custom Bean Factories? Others?
Advertisement
Answer
We use bean producers to access Spring objects in CDI. As in the architecture we used there is an interface layer between the UI and the server/business, this integration was facilitated. Integration is performed as follows.
Cdi Factory from the view/ui layer.
JavaScript
x
public class MainViewClientFactory {
public MainViewClientFactory() {
}
@ApplicationScoped
@Produces
public CadastroPaisService cadastroPaisService() {
return CdiSpringUtils.getSpringBean(CadastroPaisService.class);
}
}
The CdiSpringUtils Class.
JavaScript
public class CdiSpringUtils {
private CdiSpringUtils() {
}
public static <R, Q extends Annotation> R getSpringBean(Class<R> beanClass) {
return ApplicationContextProvider.getApplicationContext().getBean(beanClass);
}
public static <R, Q extends Annotation> R getSpringBean(Class<R> beanClass, Class<Q> qualifierClass) {
return ApplicationContextProvider.getQualifiedBeanOfType(beanClass, qualifierClass);
}
}
The ApplicationContextProvider Class.
JavaScript
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public static ApplicationContext getApplicationContext() {
return context;
}
public static <R, Q extends Annotation> R getQualifiedBeanOfType(Class<R> cls, Class<Q> qualifierAnnotationClass) {
R bean = null;
Map<String, R> beanMap = getApplicationContext().getBeansOfType(cls);
for (Map.Entry<String, R> entry : beanMap.entrySet()) {
Q targetAnnotation = getApplicationContext().findAnnotationOnBean(entry.getKey(), qualifierAnnotationClass);
if (targetAnnotation != null) {
bean = entry.getValue();
break;
}
}
return bean;
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
context = ctx;
}
}