Issue
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?
Solution
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.
public class MainViewClientFactory {
public MainViewClientFactory() {
}
@ApplicationScoped
@Produces
public CadastroPaisService cadastroPaisService() {
return CdiSpringUtils.getSpringBean(CadastroPaisService.class);
}
}
The CdiSpringUtils Class.
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.
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;
}
}
Answered By - Helder
Answer Checked By - Dawn Plyler (JavaFixing Volunteer)