Spring Data Solr和Mongo CDI

时间:2014-11-25 15:20:24

标签: spring spring-data spring-data-mongodb spring-data-solr

我正在尝试在Java EE项目中同时使用spring数据solr和spring数据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存储库。有没有解决方案?

1 个答案:

答案 0 :(得分:1)

我面临与spring数据neo4j和spring data mongo相同的问题。

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

为了让它能够发挥作用:

  1. 结帐spring-data-mongo的春天来源
  2. 在cdi包中添加注释:@MongoRepositoryCdi
  3. 使用@MongoRepositoryCdi
  4. 注释mongoRepository接口 afterLeanDiscovery方法中的
  5. 验证在创建存储库bean之前是否存在@MongoRepositoryCdi
  6. 在Neo4j lib中做同样的事情
  7. 之后...它有效!

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

    希望这有帮助!