[英]Resolving subdocument types with Spring Data and MongoDB
我在尝试解析属性表达式时遇到Spring Data存储库的错误:
public interface ContractRepository
extends MongoRepository<Contract,String> {
public List<Contract> findByCodeBindings(String binding);
}
这是Contract
的相关部分:
@Document(collection="CONTRACTS")
public class PersistentContract extends BaseContract {
@PersistenceConstructor
public PersistentContract(String name, Version version, Code code) {
super(name, version, code);
}
}
Code
是CodeImpl
实现的接口。 它包含一个属性bindings
,它在Code
有一个getter和setter。 因此,查询的属性表达式旨在使用包含给定绑定的嵌套代码文档来查找这些契约。 到现在为止还挺好。
但是,问题是抛出了IllegalArgumentException
:
java.lang.IllegalArgumentException: No property bindings found on my.company.Code!
org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225)
调试该部分代码显示Spring Data正在分离表达式并确定存在Code
类型的属性。 但是,由于Code
是一个接口,因此没有列出任何属性。
有没有办法提示Spring Data, Code
有这个属性,还是CodeImpl
是code
属性的实际类型? 我很惊讶该库不会尝试解析接口的getter或setter。
这是使用spring-data-commons 1.5.1.RELEASE和spring-data-mongodb 1.2.1.RELEASE。
感谢帮助。
我的解决方案是避免持久对象中的接口。 所以BaseContract
成为以下内容:
public abstract class BaseContract<T extends Code> {
public abstract T getCode();
}
PersistentContract
是根据具体类实现的:
public class PersistentContract extends BaseContract<CodeImpl> {
}
这似乎在编写基类中的接口和满足Spring Data对具体类的需求之间取得了适当的平衡。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.