我遇到了存储库bean定义的问题。首先,我不喜欢使用新的样式来定义存储库作为接口,而不是编写自己的实现。
所以我写简单的界面:
public interface UserRepo {
Member findByUsername(String username);
Member findByEmail(Email email);
Institution save(Institution institution);
User save(User user);
}
正如您所看到的那样,接口不会扩展任何spring数据接口,接下来我将为该接口创建自己的实现:
public class UserRepoImpl extends AbstractMongoQuerydslRepo<Member> implements UserRepo {
private static final Logger LOG = LoggerFactory.getLogger(UserRepoImpl.class);
private static final QMember memberQuery = QMember.member;
private final PathBuilder<Member> memberPath;
@Autowired
public UserRepoImpl(MongoOperations mongoOperations) {
super(mongoOperations);
Preconditions.checkNotNull(mongoOperations);
memberPath = new PathBuilderFactory().create(Member.class);
}
…
}
因此该类已将存储库实现后缀修改为 Impl ,这是默认值
EnableMongoRepository
注释中的后缀。接下来,我添加我的配置:
@EnableMongoRepositories(basePackageClasses={UserRepo.class})
public class MongoTestContext extends AbstractMongoConfiguration{
…
}
我有错误:
No qualifying bean of type [com.xxxxx.infrastructure.repo.UserRepo] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
我的配置有什么问题?我还尝试在UserRepository和UserRepositoryImpl中添加@Repository注释,但它不起作用。我的UserRepo和UserRepoImpl也有相同的包。
答案 0 :(得分:0)
我认为你在某种程度上有错误的期望。存在@EnableMongoRepositories
注释以完全激活您似乎不喜欢的自动存储库机制(我当然希望了解这样做的原因)。因此,选择退出该机制后,您还可以选择退出所有配置要求和设置(例如,默认的Impl
后缀)。
所以,如果你真的想自己实现所有这些东西(这将有效地让你成为我遇到的第一个坚持编写实际上并不需要的代码的开发人员),你只需要声明你的实现class as Spring bean - 通过使用@Component/@Repository
注释它,让构造函数使用@Autowired
注释,或者通过XML或JavaConfig手动声明bean定义。