基于Spring Data Document documentation,我提供了一个存储库方法的自定义实现。自定义方法的名称是指域对象中不存在的属性:
@Document
public class User {
String username;
}
public interface UserRepositoryCustom {
public User findByNonExistentProperty(String arg);
}
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@Override
public User findByNonExistentProperty(String arg) {
return /*perform query*/;
}
}
public interface UserRepository
extends CrudRepository<?, ?>, UserRepositoryCustom {
public User findByUsername(String username);
}
但是,也许是因为我选择的方法名称(findByNonExistentPropertyName
),Spring Data会尝试解析方法名称,并从中创建查询。当它在nonExistentProperty
中找不到User
时,会抛出异常。
可能的决议:
谢谢!
答案 0 :(得分:10)
您的实现类必须命名为UserRepositoryImpl
(如果您坚持默认配置),因为我们尝试根据找到的Spring Data存储库接口的名称进行查找。我们从这个开始的原因是我们无法可靠地知道您扩展的哪个接口是具有自定义实现的接口。鉴于这样的场景
public interface UserRepository extends CrudRepository<User, BigInteger>,
QueryDslPredicateExecutor<User>, UserRepositoryCustom { … }
我们必须以某种方式对接口进行硬编码,以便不检查自定义实现类以防止意外接收。
因此我们通常建议提出一个命名约定,即让包含要手动实现的方法的接口的Custom
后缀。然后,您可以使用CustomImpl
元素的repository-impl-postfix
属性设置存储库基础结构以使用repositories
作为后缀来获取实现类:
<mongo:repositories base-package="com.acme"
repository-impl-postfix="CustomImpl" />
reference documentation中有关于此的更多信息,但似乎您至少已经对此进行了简要检查。 :)