gpt4 book ai didi

java - 使用 Spring Data 和 MongoDB 解析子文档类型

转载 作者:可可西里 更新时间:2023-11-01 09:52:48 26 4
gpt4 key购买 nike

我在 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 具有此属性,或者 CodeImplcode 属性的实际类型?我很惊讶该库没有尝试解析接口(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com