Consider defining a bean of type ‘org.springframework.cloud.client.loadbalancer.reactive.LoadBalance

1、bug报错

问题:项目启动失败

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of constructor in com.tianji.learning.controller.InteractionQuestionAdminController required a bean of type 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' in your configuration.

09:24:18.140-[DESKTOP-1G6DPV3][sys] - WARN 22536 --- [       Thread-1] c.a.n.common.http.HttpClientBeanHolder   : [HttpClientBeanHolder] Start destroying common HttpClient

查看日志

09:24:18.106-[DESKTOP-1G6DPV3][sys] - WARN 22536 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception thrown from ApplicationListener handling ContextClosedEvent
org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'rabbitConnectionFactory': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220) ~[spring-beans-5.3.22.jar:5.3.22]

image-20240811093442742

2、bug解决

一开始我以为是依赖导入错误,没有添加负载均衡的依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

但是,添加完依赖后,重启还是一样的

再次查看日志发现

Parameter 1 of constructor in com.tianji.learning.controller.InteractionQuestionAdminController required a bean of type 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' that could not be found.

这个错误表明应用程序启动失败,主要原因是 InteractionQuestionAdminController 的构造函数需要一个 LoadBalancerBeanPostProcessorAutoConfiguration 类型的 bean,但是系统中找不到这个 bean。

查看InteractionQuestionAdminController方法

@RestController
@Api(tags = "问题相关接口-管理端")
@RequestMapping("/admin/questions")
@Slf4j
@RequiredArgsConstructor
public class InteractionQuestionAdminController {

    private final IInteractionQuestionService questionService;
    private final LoadBalancerBeanPostProcessorAutoConfiguration loadBalancerBeanPostProcessorAutoConfiguration;

    @GetMapping("/page")
    @ApiOperation("管理端分页查询问题")
    public PageDTO<QuestionAdminVO> queryQuestionPageAdmin(QuestionAdminPageQuery query){
        log.info("管理端分页查询问题:{}",query);
        return questionService.queryQuestionPageAdmin(query);
    }

}

发现不知道什么时候idea自己帮我注入了

private final LoadBalancerBeanPostProcessorAutoConfiguration loadBalancerBeanPostProcessorAutoConfiguration;

这行代码实际上是一个错误的依赖注入。LoadBalancerBeanPostProcessorAutoConfiguration 是 Spring Cloud 负载均衡器的一个自动配置类,它不应该被直接注入到控制器或其他业务组件中。

  1. LoadBalancerBeanPostProcessorAutoConfiguration 的作用:
    • 这是一个自动配置类,用于设置负载均衡器相关的 Bean 后处理器。
    • 它是 Spring Cloud 负载均衡功能的一部分,用于自动配置和设置负载均衡的相关组件。
    • 这个类通常由 Spring 框架自动处理,不需要开发者直接使用或注入。
  2. 为什么不应该在控制器中注入:
    • 自动配置类是用来配置 Spring 应用上下文的,不是设计用来在业务代码中直接使用的。
    • 直接注入这个类不会提供任何有用的功能,反而可能导致意外的行为或错误。
    • 它违反了关注点分离的原则,将基础设施的配置逻辑混入了业务逻辑中。
  3. 正确的使用方式:
    • 通常,你只需要在项目中添加正确的 Spring Cloud 依赖,框架就会自动处理负载均衡的配置。
    • 如果需要使用负载均衡功能,你应该注入和使用 LoadBalancerClient@LoadBalanced RestTemplate,而不是配置类本身。

将它删除后,项目成功启动

image-20240811093752956

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 请在您的配置中定义一个类型为'org.springframework.cloud.client.loadbalancer.reactive.deferringloadbalancerexchangefilterfunction'的bean。 ### 回答2: 这个问题看起来像是 Spring Cloud 在运行过程中出现的错误。错误的根本原因在于缺少了一个类型为 'org.springframework.cloud.client.loadbalancer.reactive.deferringloadbalancerexchangefilterfunction' 的 Bean。要解决这个问题,需要在 Spring Cloud 的配置文件中定义一个这样的 Bean。 当我们使用 Spring Cloud 中的 Reactive Load Balancer 时,它将需要一个类型为 'DeferringLoadBalancerExchangeFilterFunction' 的 Bean。这个 Bean 实现了 Reactive Load Balancer 的核心功能,所以在应用程序启动时将自动创建它。但是,如果在 Spring Cloud 的配置文件中缺少了相应的配置,就可能会导致这个 Bean 无法创建。 要解决这个问题,我们需要在应用程序的配置文件中添加以下代码: @Configuration public class AppConfig { @Bean public DeferringLoadBalancerExchangeFilterFunction deferringLoadBalancerExchangeFilterFunction( LoadBalancerClientFactory clientFactory) { return new DeferringLoadBalancerExchangeFilterFunction(clientFactory); } } 这个代码片段创建了一个类型为 'DeferringLoadBalancerExchangeFilterFunction' 的 Bean,并将其注入到 Spring 的容器中。在这个例子中,我们使用了 Spring CloudLoadBalancerClientFactory 类来创建这个 Bean。这意味着我们需要在我们的应用程序中引入 Spring Cloud Loadbalancer 的依赖,并且需要在配置文件中提供相关的配置。 总的来说,在 Spring Cloud 开发中,我们需要确保所有的配置文件和依赖项都正确地定义和引入。否则,我们可能会遇到一些奇怪的错误和行为。 ### 回答3: 在使用Spring Cloud微服务架构时,经常会出现“consider defining a bean of typeorg.springframework.cloud.client.loadbalancer.reactive.deferringloadbalancerexchangefilterfunction’ in your configuration”的提示。这个提示的意思是在您的配置中考虑定义一个类型为‘org.springframework.cloud.client.loadbalancer.reactive.deferringloadbalancerexchangefilterfunction’的bean。 在Spring Cloud架构中,LoadBalancerClient是用来进行负载均衡的组件。在Reactive编程中,当应用程序需要访问外部服务时,需要使用Webclient来进行访问。负载均衡器需要作为Webclient中的一个组件,进行服务的负载均衡。而DeferringLoadBalancerExchangeFilterFunction就是一个提供负载均衡器功能的ExchangeFilterFunction类型的过滤器。 如果您正在使用Spring Cloud架构,并且遇到了“consider defining a bean of typeorg.springframework.cloud.client.loadbalancer.reactive.deferringloadbalancerexchangefilterfunction’ in your configuration”的提示,请按照以下步骤进行操作: 1. 在您的配置文件中添加以下代码: ```java @Bean @LoadBalanced public WebClient.Builder loadBalancedWebClientBuilder() { return WebClient.builder().filter(loadBalancerExchangeFilterFunction()); } @Bean public DeferringLoadBalancerExchangeFilterFunction loadBalancerExchangeFilterFunction() { return new DeferringLoadBalancerExchangeFilterFunction(); } ``` 2. 将上述代码粘贴到您的Spring Boot应用程序中的@Configuration类中。 3. 重新启动应用程序并检查是否仍然出现提示。 通过以上操作,您就可以解决“consider defining a bean of typeorg.springframework.cloud.client.loadbalancer.reactive.deferringloadbalancerexchangefilterfunction’ in your configuration”提示。同时,您的应用程序已经具备了负载均衡的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林学习编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值