我在 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
实现的接口(interface)。它包含一个属性 bindings
,在 Code
中有一个 getter 和 setter。因此,查询的属性表达式旨在查找那些具有包含给定绑定(bind)的嵌套代码文档的契约(Contract)。到目前为止,还不错。
但是,问题是正在抛出 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
是一个接口(interface),所以它没有列出任何属性。
是否有办法向 Spring Data 提示 Code
具有此属性,或者 CodeImpl
是 code
属性的实际类型?我很惊讶该库没有尝试解析接口(interface)的 getter 或 setter。
这是使用 spring-data-commons 1.5.1.RELEASE 和 spring-data-mongodb 1.2.1.RELEASE。
感谢帮助。
最佳答案
我的解决方案是在持久对象中完全避免接口(interface)。所以 BaseContract
变成了下面这样:
public abstract class BaseContract<T extends Code> {
public abstract T getCode();
}
PersistentContract
是根据具体类实现的:
public class PersistentContract extends BaseContract<CodeImpl> {
}
这似乎在针对基类中的接口(interface)进行编码和满足 Spring Data 对具体类的需求之间取得了正确的平衡。
关于java - 使用 Spring Data 和 MongoDB 解析子文档类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16241901/