spring-data-jpa 应用程序上下文中某些Bean的依赖关系形成了一个循环

6jygbczu  于 2022-11-10  发布在  Spring
关注(0)|答案(6)|浏览(276)

我正在使用JPA开发Sping Boot v1.4.2.RELEASE应用程序。
我定义了存储库接口和实现

A存储库

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

A存储库自定义

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

A存储库实现

@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;
    }
    ...
}

我的应用程序无法启动,并显示以下消息:


***************************

APPLICATION FAILED TO START

***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

|  aRepositoryImpl
└─────┘

我遵循了www.example.com中描述的所有步骤http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour
救命啊!
劳伦特

ldioqlga

ldioqlga1#

使用@Lazy
打破循环的一个简单方法是让Spring惰性地初始化其中一个bean,即:而不是完全初始化bean,它会创建一个代理将它注入到另一个bean中。2被注入的bean只有在第一次需要时才会被完全创建。

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

来源:https://www.baeldung.com/circular-dependencies-in-spring

lyfkaqu1

lyfkaqu12#

使用@Lazy注解,它将被解析

@Component
public class Bean1 {
    @Lazy
    @Autowired
    private Bean2 bean2;
}
gpnt7bae

gpnt7bae3#

有一个简单的方法可以解决您原来的问题:只需要从ARepositoryCustom和ARepositoryImpl中删除@Repository。保留所有的命名和接口/类层次结构。它们都是可以的。

vdgimpew

vdgimpew4#

我测试了你的源代码,发现了一些棘手的问题。
首先,在源代码中,我遇到了以下错误:

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(自定义存储库)之间“混淆”了。所以,我建议您ARepository重命名为其他名称,例如BRepository。如果我重命名类名,它将工作。
根据Spring Data(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/)的官方文档:
这些类需要遵循命名约定,即在找到的存储库接口名称后附加名称空间元素的属性repository-impl-postfix。此后缀默认为Impl

2o7dmzc5

2o7dmzc55#

把这个添加到你的pom.xml文件中。它对我很有效

spring.main.allow-circular-references:true
fykwrbwg

fykwrbwg6#

在我的情况下:我添加了

spring:
   main:
    allow-circular-references: true

在应用程序中。yml
或者您可以添加

spring.main.allow-circular-references=true

中application.properties
以下目录中的应用程序.yml和application.properties文件:

相关问题