9

基于Spring Data Document 文档,我提供了一个存储库方法的自定义实现。自定义方法的名称是指域对象中不存在的属性:

@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 尝试解析方法名,并从中创建查询。当它找不到nonExistentPropertyin 时User,将引发异常。

可能的解决方案:

  1. 我在如何提供自定义方法的实现方面犯了错误吗?
  2. 有没有办法指示 Spring 不要尝试基于此方法的名称生成查询?
  3. 我是否只需要避免使用 Spring Data 识别的任何前缀?
  4. 以上都不是。

谢谢!

4

1 回答 1

11

您的实现类必须命名UserRepositoryImpl(如果您坚持默认配置),因为我们尝试根据找到的 Spring Data 存储库接口的名称来查找它。我们从那个开始的原因是我们无法可靠地知道您扩展的哪些接口是具有自定义实现的接口。给定这样的场景

public interface UserRepository extends CrudRepository<User, BigInteger>,
  QueryDslPredicateExecutor<User>, UserRepositoryCustom { … }

我们将不得不以某种方式对接口进行硬编码,以不检查自定义实现类以防止意外拾取。

所以我们通常建议提出一个命名约定,比如说Custom包含要手动实现的方法的接口的后缀。然后,您可以使用元素的属性设置存储库基础结构以使用CustomImpl作为后缀的实现类:repository-impl-postfixrepositories

<mongo:repositories base-package="com.acme" 
                    repository-impl-postfix="CustomImpl" />

参考文档中有更多相关信息,但您似乎至少已经简要检查过。:)

于 2011-11-11T15:20:32.407 回答