Spring Data Solr and Mongo CDI



我正在尝试在Java EE项目中同时使用Spring data solr和spring data mongo。问题在于两者兼而有之

https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/cdi/MongoRepositoryExtension.java

https://github.com/spring-projects/spring-data-solr/blob/master/src/main/java/org/springframework/data/solr/repository/cdi/SolrRepositoryExtension.java

尝试将MongoOperations和SolrOperations注入存储库。之后两者都创建了存储库,然后我最终得到了一个模棱两可的 cdi 依赖项异常。在这里查看源代码

https://github.com/spring-projects/spring-data-commons/blob/master/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryExtensionSupport.java

似乎没有办法区分 SolR 存储库和 MONGO 存储库。有什么解决办法吗?

我在弹簧数据 neo4j 和弹簧数据 mongo 上也面临着同样的问题。

当前 beanDiscovery() 在 CdiRepositoryExtensionSupport 中的实现.java为所有存储库创建 Bean 实例。当您使用多个 Spring-Data-xxx 时,上下文中有多个 Bean 引用,并且会出现不明确的名称异常。

为了使它工作,我做了:

    查看春季数据蒙
  1. 戈的春季来源
  2. 在 CDI 包中添加注释:@MongoRepositoryCdi
  3. 用@MongoRepositoryCdi注释了 mongoRepository 接口
  4. 在之后BeanDiscovery方法验证@MongoRepositoryCdi在创建存储库Bean之前是否存在
  5. 在 Neo4j lib 中做同样的事情

后。。。它有效!

也许这不是解决这个问题的最佳方法,Spring Data项目的人可以找到更好的解决方案

CdiRepositoryExtensionSupport.java

void afterBeanDiscovery(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager) {
    for (Entry<Class<?>, Set<Annotation>> entry : getRepositoryTypes()) {
        Class<?> repositoryType = entry.getKey();
        Set<Annotation> qualifiers = entry.getValue();
        if (repositoryType.isAnnotationPresent(MongoRepositoryCdi.class)) {
            // Create the bean representing the repository.
            CdiRepositoryBean<?> repositoryBean = createRepositoryBean(repositoryType, qualifiers, beanManager);
            if (LOG.isInfoEnabled()) {
                LOG.info(String.format("Registering bean for %s with qualifiers %s.", repositoryType.getName(), qualifiers));
            }
            // Register the bean to the container.
            registerBean(repositoryBean);
            afterBeanDiscovery.addBean(repositoryBean);
        }
    }
}

存储 库

@Eager @MongoRepositoryCdi public interface TestDocumentRepository extends MongoRepository<TestDocument, String>{}

希望这有帮助!