web-dev-qa-db-fra.com

Les dépendances de certains beans dans le contexte de l’application forment un cycle

Je travaille sur une application Spring Boot v1.4.2.RELEASE avec JPA.

J'ai défini les interfaces et les implémentations du référentiel

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);
    }
}

Et un service AServiceImpl

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

Mon application ne commence pas par le message:

 *************************** 
 APPLICATION ÉCHOUÉE DE COMMENCER 
 ********** ***************** 

 Description: 

 Les dépendances de certains des haricots dans le contexte de l'application forment un cycle: 

 | aRepositoryImpl 
 └─────┘ 

J'ai suivi toutes les étapes décrites dans http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour

S'il vous plaît aider!

Laurent

8
Laurent Maillet

Il existe une solution simple à votre problème initial: Supprimez simplement @Repository d'ARepositoryCustom et d'ARepositoryImpl . Conservez toutes les hiérarchies de dénomination et d'interface/classe. Ils vont tous bien.

5
Andrei Pietrusel

J'ai testé votre code source et trouvé quelque chose de compliqué.

Tout d'abord, avec votre code source, j'ai eu l'erreur suivante:

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

Ensuite, je suppose que Spring 'a confondu' entre ARepository (référentiel JPA) et ARepositoryImpl (référentiel personnalisé). Donc, je vous suggérerais renommerARepository en quelque chose d'autre, tel que BRepository. Cela a fonctionné si j'ai renommé le nom de la classe.

Selon la documentation officielle de Spring Data ( https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ ): 

Ces classes doivent respecter la convention de dénomination qui consiste à ajouter l’attribut repository-impl-postfix de l’élément namespace au nom de l’interface de référentiel trouvée. _ {Ce suffixe par défaut: Impl}

2
Phat H. VU