Java SpringDataMongoDB尝试为自定义存储库方法生成查询
基于,我提供了存储库方法的自定义实现。自定义方法的名称引用了域对象中不存在的属性:Java SpringDataMongoDB尝试为自定义存储库方法生成查询,java,mongodb,spring-data,spring-data-document,Java,Mongodb,Spring Data,Spring Data Document,基于,我提供了存储库方法的自定义实现。自定义方法的名称引用了域对象中不存在的属性: @Document public class User { String username; } public interface UserRepositoryCustom { public User findByNonExistentProperty(String arg); } public class UserRepositoryCustomImpl implements UserRep
@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);
}
@文档
公共类用户{
字符串用户名;
}
公共接口UserRepositoryCustom{
公共用户findByNonExistentProperty(字符串arg);
}
公共类UserRepositoryCustomImpl实现UserRepositoryCustom{
@凌驾
公共用户findByNonExistentProperty(字符串参数){
返回/*执行查询*/;
}
}
公共接口用户存储库
扩展CRUDepository、UserRepositoryCustom{
公共用户findByUsername(字符串用户名);
}
然而,可能是因为我选择了方法名(findByNonExistentPropertyName
),Spring数据试图解析方法名,并从中创建查询。当它在用户
中找不到不存在属性
时,将引发异常
可能的决议:
谢谢大家! 您的实现类必须命名为
UserRepositoryImpl
(如果您坚持默认配置),因为我们试图根据找到的Spring数据存储库接口的名称进行查找。我们从这个接口开始的原因是,我们无法可靠地知道您扩展的哪些接口是具有自定义实现的接口。在这种情况下
public interface UserRepository extends CrudRepository<User, BigInteger>,
QueryDslPredicateExecutor<User>, UserRepositoryCustom { … }
在中有更多关于这方面的信息,但您似乎至少简要地检查了这一点。:) 我不确定这是否是实际问题,但UserRepositoryCustomImpl不应该实现UserRepositoryCustom吗?是的,你是对的,确实如此,我在写问题时忽略了这一点。非常感谢。非常感谢你!我完全没有注意到示例中的实现名称不包含
Custom
。由于我是在实现UserRepositoryCustom
,我直觉地认为Spring数据会寻找一个名为UserRepositoryCustomImpl
的类,但我可以理解,在不要求用户提供额外元数据的情况下,实现这个类可能有多困难。感谢您和整个Spring数据团队创建了如此出色的项目!不客气。我们知道这将是一个更直观的方式,你最初的想法,所以我很感谢你问这个问题,因为我们创造了一些信息点,这样:)。
<mongo:repositories base-package="com.acme"
repository-impl-postfix="CustomImpl" />