我正在使用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
救命啊!
劳伦特
6条答案
按热度按时间ldioqlga1#
使用
@Lazy
打破循环的一个简单方法是让Spring惰性地初始化其中一个bean,即:而不是完全初始化bean,它会创建一个代理将它注入到另一个bean中。2被注入的bean只有在第一次需要时才会被完全创建。
来源:https://www.baeldung.com/circular-dependencies-in-spring
lyfkaqu12#
使用@Lazy注解,它将被解析
gpnt7bae3#
有一个简单的方法可以解决您原来的问题:只需要从ARepositoryCustom和ARepositoryImpl中删除@Repository。保留所有的命名和接口/类层次结构。它们都是可以的。
vdgimpew4#
我测试了你的源代码,发现了一些棘手的问题。
首先,在源代码中,我遇到了以下错误:
然后,我猜Spring在
ARepository
(JPA存储库)和ARepositoryImpl
(自定义存储库)之间“混淆”了。所以,我建议您将ARepository
重命名为其他名称,例如BRepository
。如果我重命名类名,它将工作。根据Spring Data(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/)的官方文档:
这些类需要遵循命名约定,即在找到的存储库接口名称后附加名称空间元素的属性repository-impl-postfix。此后缀默认为Impl
2o7dmzc55#
把这个添加到你的pom.xml文件中。它对我很有效
fykwrbwg6#
在我的情况下:我添加了
在应用程序中。yml
或者您可以添加
中application.properties
以下目录中的应用程序.yml和application.properties文件: