繁体   English   中英

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

[英]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);
    }
}

CodeCodeImpl实现的接口。 它包含一个属性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有这个属性,还是CodeImplcode属性的实际类型? 我很惊讶该库不会尝试解析接口的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM