1

我正在尝试在 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 存储库。有什么解决办法吗?

4

1 回答 1

1

我在使用 spring data neo4j 和 spring data mongo 时遇到了同样的问题。

CdiRepositoryExtensionSupport.java 中 afterBeanDiscovery() 的当前实现为所有存储库创建 bean 实例。当您使用多个 Spring-Data-xxx 时,上下文中有多个 bean 引用,并且会出现模棱两可的名称异常。

为了使它工作,我这样做:

  1. 查看 spring-data-mongo 的 spring 资源
  2. 在 cdi 包中添加注释:@MongoRepositoryCdi
  3. 用 @MongoRepositoryCdi 注释了 mongoRepository 接口
  4. 在 afterBeanDiscovery 方法中,在创建存储库 bean 之前验证 @MongoRepositoryCdi 是否存在
  5. 在 Neo4j 库中做同样的事情

之后……它起作用了!

也许这不是解决这个问题的最佳方法,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>{}

希望这有帮助!

于 2014-12-10T21:23:54.597 回答