【发布时间】: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