【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法

原因是合了同事的代码后,自己的模块启动不了了,但是其他模块都正常启动。折腾一早上,百度和GPT都不能很好的解决我的问题,终于解决了这个问题,记录一下分析问题的过程,最下面是省流版。

文章目录

      • 报错信息如下:
      • ai分析的 结果
      • 实际的临时解决方案:
      • 归因推测
        • 推测一:api模块的bean注入都出现了问题
        • 推测二:资源模块没有扫描api模块的bean
      • 推测三:资源模块的feign配置出问题了,导致feign的client注入都有问题
      • 推测四:resources的配置yml文件问题
      • 验证思路二:将资源模块可行的client搬到api模块后再做一次测试
      • 最终确认问题所在
    • 最终省流版
      • 问题描述
      • 问题原因?
      • 解决方法

报错信息如下:

Unexpected exception during bean creation; nested exception is java.lang.IllegalStateException: No bean found of type interface feign.codec.Encoder for areaControllerClient

ai分析的 结果

这个错误提示显示在启动Spring Cloud时出现了问题,具体是在创建bean时抛出了异常,异常信息显示找不到类型为feign.codec.Encoder的接口的bean。解决这个问题可以考虑以下几个方面:

  1. 检查是否存在该接口的实现类并且已经被正确地注入到Spring容器中。
  2. 检查是否存在版本冲突或者依赖缺失等问题导致该接口无法被正确加载。
  3. 检查是否在使用feign进行服务调用时出现了错误,例如请求参数不正确等。

希望这些提示能够帮助您解决问题。

实际的临时解决方案:

根据启动的报错信息,发现下面的三个类在注入容器时报错,注释掉对应的代码后正常启动

image-20230808102456406

这三个类有一个共同的点:都注入了feign的客户端bean

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第1张图片

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第2张图片

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第3张图片

如上图注解掉后,项目启动正常。

归因推测

  1. 出现时间:在和主分支合并之后出现问题

  2. 问题情况,只有资源模块启动报错,其他的模块(附件、系统模块)注入feign客户端正常,且不会报错(测试没问题。并且feign的实体存在

    【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第4张图片

  3. 三个报错的代码模块都在是api模块内

推测一:api模块的bean注入都出现了问题

在resources模块,测试如下:

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第5张图片

确实是取不到这个工具。

但是,如果在system模块测试呢——> 成功了,奇怪的是,在系统模块内可以正常找到(不影响启动

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第6张图片

验证结果:资源模块在注入api模块的bean时出了问题,推测是没有扫描?

推测二:资源模块没有扫描api模块的bean

在api模块下创建一个新的bean

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第7张图片

验证结果:验证失败,资源模块api模块下的bean其实正常扫描并注入了。其实既然会报错也可以知道,肯定是有扫描到api模块的bean 的

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第8张图片

推测三:资源模块的feign配置出问题了,导致feign的client注入都有问题

在系统模块(正常环境)下获取feign客户端 :成功获取

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第9张图片

在资源模块下获取feign:失败

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第10张图片

报错如下

Error creating bean with name 'com.huicoo.forestry.basic.api.client.system.SystemAreaApiClient': Unexpected exception during bean creation

验证结果:符合预期,资源模块下因为某些原因,feign的模块都注入失败了

推测四:resources的配置yml文件问题

yml和系统模块比对

  • 数据库部分(没影响

  • 自定义部分(没影响

  • feign部分?【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第11张图片

    删去

bootstrap.yml

和patrol模块比对,新增了这个配置

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第12张图片

验证:重启项目还是不行

验证思路二:将资源模块可行的client搬到api模块后再做一次测试

验证结果:没有影响,搬到api模块后依然可以调用和使用

【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第13张图片

验证结果:系统模块也可以调用这个模块。but,系统模块其他client竟然取不到了【问题总结】SpringCloud启动报错:No bean found of type interface feign.codec.Encoder for 解决方法_第14张图片

最终确认问题所在

意外的发现:就是这个上传下载的文件的client文件,这个文件有一个配置类,和其他同事写的文件重复注入了,结果导致报错了

最终省流版

问题描述

我在使用springcloud时,在添加了一个调用附件模块的feign类后报错:

@FeignClient(name = "******-attachment", configuration = FeignClientToAttach.MultipartSupportConfig.class)
public interface FeignClientToAttach {

    @PostMapping(value = "/attachment/operation/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    RestResult<FileRecord> upload(@RequestBody MultipartFileParam fileParam) throws IOException;

    @GetMapping(value = "/attachment/operation/download", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    ResponseEntity<byte[]> downloadFile(@RequestParam("fileName") String fileName, @RequestParam("isOnLine") boolean isOnLine);


    @Configuration
    class MultipartSupportConfig {

        @Autowired
        private ObjectFactory<HttpMessageConverters> messageConverters;

        @Bean
        @Primary
        @Scope("prototype")
        public Encoder feignFormEncoder() {
            return new SpringFormEncoder(new SpringEncoder(messageConverters));
        }
    }

}

遇到了如下的错误“No bean found of type interface feign.codec.Encoder for”,

问题原因?

经过排查,发现问题出在内部的配置类里面,这个类重复声明了Encoder,导致bean创建失败

解决方法

找到冲突类,将配置类提出来

@Configuration
public class MultipartSupportConfig {


    @Bean
    @Primary
    @Scope("prototype")
    public Encoder multipartFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(() -> new HttpMessageConverters(new RestTemplate().getMessageConverters())));
    }

}

你可能感兴趣的:(备忘录,问题总结,spring,cloud,spring,feign)