如何从我正在更新的旧 Springboot 应用程序中删除此循环依赖错误?

问题描述 投票:0回答:1

我查看了 StackOverflow 上的其他类似问题,但没有找到任何有效的答案。我正在更新一个旧的 Spring boot 应用程序,该应用程序工作正常,但是当将其更新到 2.7.18 时,它抱怨循环依赖。

原始代码可以在 Github 上找到: https://github.com/SabreDevStudio/SACS-Java/blob/dependabot/maven/org.springframework-spring-core-5.2.24.RELEASE/README.md

我已经成功修复了一个问题,但是我陷入了更复杂的 A -> B -> C 到 A 的循环依赖关系。以下是导致循环依赖的 3 段代码:

@Service
public class SessionPool {

https://github.com/SabreDevStudio/SACS-Java/blob/fc3654b1f332652a1ae3124900037f4694d1df3b/soap/src/main/java/com/sabre/api/sacs/soap/pool/SessionPool.java

@Controller
@Scope("prototype")
public class SessionCreateWrapper extends WebServiceGatewaySupport {

https://github.com/SabreDevStudio/SACS-Java/blob/fc3654b1f332652a1ae3124900037f4694d1df3b/soap/src/main/java/com/sabre/api/sacs/soap/session/SessionCreateWrapper.java

@Component
@Scope("prototype")
public class SessionCreateInterceptor extends AbstractSessionInterceptor {

https://github.com/SabreDevStudio/SACS-Java/blob/fc3654b1f332652a1ae3124900037f4694d1df3b/soap/src/main/java/com/sabre/api/sacs/soap/interceptor/SessionCreateInterceptor.java

我尝试创建一个会话管理器界面来解耦依赖关系

public interface SessionManager {
    void addToPool(Security session);
    Security getFromPool(SharedContext context);
}

在SessionPool中实现SessionManager接口 所以SessionCreateWrapper依赖于SessionManager SessionCreateInterceptor 实现 SessionManager

But then I get this error:
    Parameter 0 of constructor in com.sabre.api.sacs.soap.session.SessionCreateWrapper required a single bean, but 2 were found:
    - sessionCreateInterceptor: defined in file [C:\CODE\SACS-Java\soap\target\classes\com\sabre\api\sacs\soap\interceptor\SessionCreateInterceptor.class]
    - sessionPool: defined in file [C:\CODE\SACS-Java\soap\target\classes\com\sabre\api\sacs\soap\pool\SessionPool.class]

我也尝试过使用 setter 注入,但这只是改变了循环依赖。错误是:

  workflowTrigger (field private com.sabre.api.sacs.soap.pool.SessionPool com.sabre.api.sacs.flowtrigger.WorkflowTrigger.sessionPool)
┌─────┐
|  sessionPool
└─────┘

当然,如果我使用 spring.main.allow-circular-references=true ,代码就可以工作,但我不想按照建议使用它。请帮忙!

java spring-boot circular-dependency
1个回答
0
投票

如果重构代码来摆脱这种循环依赖不是一种选择,您可以通过在其中一个 bean 中使用

@Lazy
注入来解决它。

请参阅此答案以供参考。

© www.soinside.com 2019 - 2024. All rights reserved.