【问题标题】:SpringBoot fails to find Mongo RepositorySpring Boot 找不到 Mongorepository
【发布时间】:2018-05-18 02:29:25
【问题描述】:

我在尝试向我的应用程序添加第二个 mongo 数据库时遇到问题。我这样做是通过添加第二个 MongoTemplate 使用配置前缀和特定的 bean 名称。

我有一个像这样的 AbstractMongoConfig

public abstract class AbstractMongoConfig {
    private String uri;

    public void setUri(String uri) {
        this.uri = uri;
    }

    public MongoDbFactory mongoDbFactory() throws Exception {
        return new SimpleMongoDbFactory(new MongoClientURI(uri));
    }

    abstract public MongoTemplate getMongoTemplate() throws Exception;                                                                        }

我将其扩展到这样的特定模板配置...要添加另一个 mongo DB,我会添加另一个,然后注释不同的存储库以通过 templateRef 使用不同的配置,对吗?

@Configuration
@ConfigurationProperties(prefix="server.mongodb")
public class ServerMongoConfig extends AbstractMongoConfig {
    @Primary
    @Override
    @Bean(name="serverMongoTemplate")
    public MongoTemplate getMongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

有了这个,我应该能够放置像 server.mongodb.uri=...这样的配置了。

我有一个使用这个的仓库

@Repository
public interface MAPRepository extends MongoRepository<MAP, String> {
    public List<MAP> findByName(String name);
}

还有实体

@Document(collection="maptest")
public class MAP {
    @Id
    private String id;
    private String name;
}

然后我有一个使用这个 repo 的服务类

@EnableMongoRepositories(mongoTemplateRef="serverMongoTemplate")
@Service
public class TestService {
    @Autowired
    @Qualifier(value = "serverMongoTemplate")
    private MAPRepository mrepo;

    ... use mrepo ...
}

但是在启动时出现错误

Description:

Field mrepo in testpkg.svc.TestHandler required a bean of type 'testpkg.repo.MAPRepository' that could not be found.

Action:

Consider defining a bean of type 'testpkg.repo.MAPRepository' in your configuration.

及以下...

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'testpkg.repo.MAPRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=serverMongoTemplate)}

该服务与存储库位于不同的包中,但我已经检查了导入以及所有这些......它都匹配得很好。 MAPRepository 使用 @Repository 进行注释,这意味着它应该可以作为 bean 使用,对吧?

这里还有什么可能导致它看不到 bean?有没有我可以打开调试的类来弄清楚发生了什么?

在我添加 ServerMongoConfig 之前,它运行良好。它能够毫无问题地写入该数据库。刚才还不能正常实例化。

【问题讨论】:

  • 为什么你的private MAPRepository mrepo; 上有@Qualifier(value = "serverMongoTemplate")
  • 我只是在尝试什么...似乎没有任何效果
  • @EnableMongoRepositories(mongoTemplateRef="serverMongoTemplate") 应该在一个用@Configuration 注释的类上,而不是在用于声明一个bean 的@Service
  • 如果我将所有服务、repo 等都放在同一个包中,它就可以工作,而 @EnableMongoRepositories@Qualifier 似乎对它使用的模板有影响。
  • 我认为您错误地配置了您的项目。 ˋ@SpringBootApplication`注解的类应该在根包中,所以所有的bean和配置类都会被发现,为了清楚起见,通常我们把所有的ˋ@Enable...`注解放在那个类中。

标签: java spring mongodb spring-boot spring-data-jpa


【解决方案1】:

答案似乎是 @EnableMongoRepositories 需要有一个 basePackages 来引用包含新模板的正确包,否则我猜 mongoTemplateRef 无法正确找到它。

所以,关于服务类:

@EnableMongoRepositories(basePackages={"testpkg.repo"}, mongoTemplateRef="serverMongoTemplate")

一切正常。

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 2019-05-11
    • 2018-06-22
    • 2016-09-17
    • 1970-01-01
    • 2020-11-29
    • 2020-07-31
    • 2020-11-11
    • 2017-10-11
    相关资源
    最近更新 更多