【问题标题】:Spring 5.x and CDI 2.x Integration OptionsSpring 5.x 和 CDI 2.x 集成选项
【发布时间】:2020-11-20 07:10:04
【问题描述】:

考虑到 Spring 的 5.x 基线和 CDI 的 2.x 基线,由于 JSF 2.3 与 CDI 相结合,我应该考虑哪些更可行的选项来将它们集成到带有 JSF 2.3 的项目中?桥梁?定制豆工厂?其他人?

【问题讨论】:

  • JSF 2.3 应该在没有 CDI 的情况下仍然可以工作,但将来需要依赖它。所以问题是你为什么需要Spring?如果你真的需要它,我会用 CDI 构建我的视图 bean 并获得一个可以将 Spring bean 注入 CDI 的扩展。
  • 感谢评论。 Spring,组织的常规堆栈,是项目的需求。我正在寻找一个可以实际使用的扩展。像 apache delta peak addons(link) 和 spring-cid-bridge(link) 这样的项目似乎已经过时了。 flow-scope(JSF 2.2) 和 websocket(JSF 2.3) 等资源与 CDI 相关联,并且带有 Servlet 4.0+ 的 mojarra JSF 2.3 似乎需要 CDI。
  • 我会使用 CDI 作为视图然后执行以下操作:stackoverflow.com/questions/4144039/…

标签: java spring integration cdi


【解决方案1】:

我们使用 bean 生产者来访问 CDI 中的 Spring 对象。在我们使用的架构中,UI 和服务器/业务之间有一个接口层,这种集成很容易实现。 积分如下进行。

来自 view/ui 层的 Cdi Factory。

public class MainViewClientFactory {

    public MainViewClientFactory() {
    }

    @ApplicationScoped
    @Produces
    public CadastroPaisService cadastroPaisService() {
        return CdiSpringUtils.getSpringBean(CadastroPaisService.class);
    }

}

CdiSpringUtils 类。

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);
    }

}

ApplicationContextProvider 类。

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

【讨论】:

    猜你喜欢
    • 2019-05-24
    • 2013-09-02
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多