3

我在尝试解析属性表达式时遇到了 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,其中有一个 getter 和 setter Code。因此,查询的属性表达式旨在查找具有包含给定绑定的嵌套代码文档的合同。到目前为止,一切都很好。

但是,问题是IllegalArgumentException被抛出:

java.lang.IllegalArgumentException: No property bindings found on my.company.Code!
 org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225)

调试那段代码表明 Spring Data 正在分解表达式并确定存在 type 的属性Code。但是,因为Code是一个接口,所以它没有列出任何属性。

有没有办法提示Code具有此属性或该属性CodeImpl的实际类型的Spring Data code?我很惊讶该库没有尝试解析接口的 getter 或 setter。

这是使用 spring-data-commons 1.5.1.RELEASE 和 spring-data-mongodb 1.2.1.RELEASE。

感谢帮助。

4

1 回答 1

1

我的解决方案是在持久对象中完全避免接口。于是BaseContract变成了下面这样:

public abstract class BaseContract<T extends Code> {
    public abstract T getCode();
}

PersistentContract根据具体类实现:

public class PersistentContract extends BaseContract<CodeImpl> {
}

这似乎在针对基类中的接口进行编码和满足 Spring Data 对具体类的需求之间取得了正确的平衡。

于 2013-05-01T22:01:50.023 回答