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数据试图解析方法名,并从中创建查询。当它在
用户
中找不到
不存在属性
时,将引发异常

可能的决议:

  • 我在如何提供自定义方法的实现方面是否犯了错误
  • 有没有一种方法可以指示Spring不要尝试基于此方法的名称生成查询
  • 我是否必须避免使用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" />