9

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 はメソッド名を解析し、そこからクエリを作成しようとします。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 に答える