使用Couchbase企业版5.0.0版本2873和Spring Data Couchbase 2.1.2,我在问题的底部解释了错误。如果你只是需要短篇小说,那就前进吧。
如果您想要更多解释,请点击此处:
想象一下,CrudRepository方法对我来说很好。我的意思是,我不需要再添加任何方法。
存储库的外观如何?我会像这样声明一个空的存储库吗?
@Repository
public interface PersonRepository extends CrudRepository<Person, String> {
// Empty
}
或者我会直接使用CrudRepositoy作为我的Base存储库。我不这么认为,因为你需要将Type和ID传递给CrudRepository。
但问题不在于此。问题出在这里:
Spring如何实例化PersonRepository,同时考虑到没有该基本存储库的实现?看一下PersonService和PersonServiceImpl接口/实现。
接口:
@Service
public interface PersonService {
Person findOne (String id);
List<Person> findAll();
//...
}
实现:
public class PersonServiceImpl implements PersonService {
// This is the variable for the repository
@Autowired
private PersonRepository personRepository;
public Person findOne(String id){
return personRepository(id);
}
public List<Person> findAll(){
List<Hero> personList = new ArrayList<>();
Iterator<Person> it = personRepository.iterator();
while (it.hasNext()){
personList.add(it.next());
}
return personList;
}
//...
}
声明从CrudRepository扩展的空PersonRepository真的够了吗?不需要实现和说出任何关于CrudRepository的每个方法的内容。至少要告诉Spring一些构造函数...
这个疑问都是因为我在Spring尝试注入personRepository变量时遇到了这个错误:
Error creating bean with name 'personRepository': Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities).
显然,它要求有一些类至少定义实现的构造函数。我如何告诉Spring避免错误中提到的那些类型歧义?
答案 0 :(得分:0)
至于存储库,如果您严格使用Couchbase,则需要扩展CouchbaseRepository
,因为您的存储库将公开较低级别的couchbase对象/功能。
例如
public interface PersonRepository extends CouchbaseRepository<Person, String> {
}
对于您的服务,您无需定义findOne()
和findAll()
,这些都是存储库的责任。
例如
public interface PersonService {
void doOperationOnPerson(String personId);
}
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
PersonRepository personRepo;
@Override
void doOperationOnPerson(String personId) {
Person person = personRepo.findById(personId);
//do operation
}
}
请注意,@Service
注释会继续执行。 (它实际上应该以任何方式工作,但我认为实现的注释更多proper)
如果您需要定义自定义查询,那么应该在存储库本身内完成。
如果你有一个非默认的构造函数,你也可能需要在Person
类上定义一个空构造函数。
我建议您阅读有关Spring Data的更多信息。