2017-11-12 12 views
0

Couchbase Enterprise Edition 5.0.0ビルド2873とSpring Data Couchbase 2.1.2を使用すると、質問の最後にエラーが表示されます。短編小説だけが必要な場合は、先に進んでください。SpringデータCouchbaseの例でリポジトリインスタンスが解決されない

あなたはもう少し説明が必要な場合は、ここでそれが来る:

はCrudRepository方法は私には罰金であることを想像してみてください。つまり、私はこれ以上メソッドを追加する必要はありません。

リポジトリの外観はどうですか?私はこのような空のリポジトリを宣言しますか?

@Repository 
public interface PersonRepository extends CrudRepository<Person, String> { 
// Empty 
} 

また、CrudRepositoyをベースリポジトリとして直接使用しますか?あなたがTypeとIDをCrudRepositoryに渡す必要があるので、私はそうは思わない。

しかし、質問はそれではありません。ここに質問が来る:

SpringはPersonRepositoryをどのようにインスタンス化するのか、そのベースリポジトリの実装がないことを考慮して、どのように知っていますか? PersonServiceとPersonServiceImplインタフェース/実装を見てください。

インタフェース:

@Service 
public interface PersonService { 
    Person findOne (String id); 
    List<Person> findAll(); 
    //... 
} 

実装:

public class PersonServiceImpl implements PersonService { 

    // This is the variable for the repository 
    @Autowired 
    private PersonRepository personRepository; 

    public Person findOne(String id){ 
     return personRepository(id); 
    } 

    public List<Person> findAll(){ 
     List<Hero> personList = new ArrayList<>(); 

     Iterator<Person> it = personRepository.iterator(); 

     while (it.hasNext()){ 
      personList.add(it.next()); 
     } 

     return personList; 
    } 
//... 
} 

それはCrudRepositoryから延びる空PersonRepositoryを宣言すると、実際には十分ですか? CrudRepositoryの各メソッドについて何も実装する必要はありませんか?春はpersonRepository変数を注入しようとしたとき、私はこのエラーを取得していますので、少なくともいくつかのコンストラクタについて、春を告げるために何か...

この疑問はすべて、次のとおりです。

Error creating bean with name 'personRepository': Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities). 

どうやら、いくつかを持っているために求めています実装のコンストラクタを少なくとも定義するクラスです。エラーで言及されたタイプのあいまいさを避けるためにSpringにどのように伝えるべきですか?

+0

@EntityScanはすべてのクラスをチェックしていますか? – nabeel

+0

この世で私は何も確信していません... あなたは何を尋ねますか?あなたは私が何かを注釈するために行方不明だと思いますか? 実際に私の以前のエラーは、サービスにレポクラスを注入しないことです。しかし今、私はエンジンにそれを考慮に入れました、そして、私のエラーは今それをインスタンス化する時です。 まだ欠けているものがあると思うならば、それだけを言ってください:)。 ありがとうございます! – ElPiter

+0

申し訳ありません前のコメントは関連しないかもしれません、この例をチェックすると役立つかもしれませんhttp://www.javainterviewpoint.com/spring-boot-crudrepository-example/ – nabeel

答えて

0

リポジトリについては、Couchbaseを厳密に使用している場合は、リポジトリで低レベルのcouchbaseオブジェクト/機能が公開されるため、CouchbaseRepositoryを拡張する必要があります。あなたのサービスのために

例えば

public interface PersonRepository extends CouchbaseRepository<Person, String> { 
} 

、あなたはfindOne()findAll()、厳密にリポジトリの責任であるそれらを定義する必要はありません。例@Service注釈が実装に行くこと

public interface PersonService { 
    void doOperationOnPerson(String personId); 
} 

@Service 
public class PersonServiceImpl implements PersonService { 
    @Autowired 
    PersonRepository personRepo; 

    @Override 
    void doOperationOnPerson(String personId) { 
    Person person = personRepo.findById(personId); 
    //do operation 
    } 
} 

場合注

。 (どちらかといえば実際に動作するはずですが、実装上の注釈はもっとproperです)

カスタムクエリを定義する必要がある場合は、リポジトリ内で行う必要があります。

デフォルトでないコンストラクタがある場合は、Personクラスに空のコンストラクタを定義する必要がある場合もあります。

私はあなたにSpring Dataの詳細を読むことをお勧めします。

+0

私はあなたが答えたものと私が言うものとの間に大きな違いはありません私がやっている。 一方、「あなたのサービスのためにfindOne()とfindAll()を定義する必要はありませんが、これらは厳密にはリポジトリの責任です」と私は永続性操作をリポジトリ。しかし、これらのメソッドをサービスレイヤーに追加するだけで、それらのメソッドをリポジトリから利用することができます。私はgetAllとgetOneの名前を、リポジトリメソッドとの違いだけに変更することができますか? – ElPiter

+0

リポジトリをいつでもどこでもautowireして直接使うことができるのはなぜですか?機能を複製するだけです。 – prettyvoid

+0

デザインパターンのパラダイムをコミットするだけです。サービス層は1つのものであり、リポジトリ層は別のものです。 この場合、サービス層は「ばか」です。リポジトリ1への呼び出し。しかしスケーラビリティのために、私はいつもそれが正しい方法であることを強く求めました。 ;) – ElPiter

関連する問題