web-dev-qa-db-ja.com

アプリケーションコンテキスト内のいくつかのBeanの依存関係がサイクルを形成します

JPAでSpring Boot v1.4.2.RELEASEアプリケーションに取り組んでいます。

リポジトリのインターフェイスと実装を定義しました

ARepository

@Repository
public interface ARepository extends CrudRepository<A, String>, ARepositoryCustom, JpaSpecificationExecutor<A> {
}

ARepositoryCustom

@Repository
public interface ARepositoryCustom {
    Page<A> findA(findAForm form, Pageable pageable);
}

ARepositoryImpl

@Repository
public class ARepositoryImpl implements ARepositoryCustom {
    @Autowired
    private ARepository aRepository;
    @Override
    public Page<A> findA(findAForm form, Pageable pageable) {
        return aRepository.findAll(
                where(ASpecs.codeLike(form.getCode()))
                .and(ASpecs.labelLike(form.getLabel()))
                .and(ASpecs.isActive()),
                pageable);
    }
}

そして、サービスAServiceImpl

@Service
public class AServiceImpl implements AService {
    private ARepository aRepository;
    public AServiceImpl(ARepository aRepository) {
        super();
        this.aRepository = aRepository;
    }
    ...
}

私のアプリケーションはメッセージで始まりません:

 *************************** 
アプリケーションの開始に失敗しました
 **** *********************** 
 
説明:
 
いくつかの依存関係アプリケーションコンテキストのBeanはサイクルを形成します:
 
 | aRepositoryImpl 
└─────┘

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour に記載されているすべての手順に従いました

助けてください !

ローラン

10
Laurent Maillet

元の問題に対する簡単な修正があります:ARepositoryCustomおよびARepositoryImplから@Repositoryを削除するだけです。すべての命名およびインターフェース/クラス階層を保持します。すべて大丈夫です。

6

私はあなたのソースコードをテストしましたが、トリッキーな何かを見つけました。

まず、ソースコードで、次のエラーが表示されました。

There is a circular dependency between 1 beans in the application context:
- ARepositoryImpl (field private test.ARepository test.ARepositoryImpl.aRepository)
- aRepositoryImpl

次に、SpringはARepository(JPAリポジトリ)とARepositoryImpl(カスタムリポジトリ)の間で「混乱」していると思います。したがって、renameARepositoryBRepositoryなどの別のものに変更することをお勧めします。クラス名を変更するとうまくいきました。

Spring Dataの公式ドキュメントによると( https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ ):

これらのクラスは、名前空間要素の属性repository-impl-postfixを、見つかったリポジトリインターフェイス名に追加するという命名規則に従う必要があります。 この接尾辞のデフォルトはImpl

2
Phat H. VU