原因是合了同事的代码后,自己的模块启动不了了,但是其他模块都正常启动。折腾一早上,百度和GPT都不能很好的解决我的问题,终于解决了这个问题,记录一下分析问题的过程,最下面是省流版。
Unexpected exception during bean creation; nested exception is java.lang.IllegalStateException: No bean found of type interface feign.codec.Encoder for areaControllerClient
这个错误提示显示在启动Spring Cloud时出现了问题,具体是在创建bean时抛出了异常,异常信息显示找不到类型为feign.codec.Encoder的接口的bean。解决这个问题可以考虑以下几个方面:
希望这些提示能够帮助您解决问题。
根据启动的报错信息,发现下面的三个类在注入容器时报错,注释掉对应的代码后正常启动
这三个类有一个共同的点:都注入了feign的客户端bean
如上图注解掉后,项目启动正常。
出现时间:在和主分支合并之后出现问题
问题情况,只有资源模块启动报错,其他的模块(附件、系统模块)注入feign客户端正常,且不会报错(测试没问题。并且feign的实体存在
三个报错的代码模块都在是api模块内
在resources模块,测试如下:
确实是取不到这个工具。
但是,如果在system模块测试呢——> 成功了,奇怪的是,在系统模块内可以正常找到(不影响启动
验证结果:资源模块在注入api模块的bean时出了问题,推测是没有扫描?
在api模块下创建一个新的bean
验证结果:验证失败,资源模块api模块下的bean其实正常扫描并注入了。其实既然会报错也可以知道,肯定是有扫描到api模块的bean 的
在系统模块(正常环境)下获取feign客户端 :成功获取
在资源模块下获取feign:失败
报错如下
Error creating bean with name 'com.huicoo.forestry.basic.api.client.system.SystemAreaApiClient': Unexpected exception during bean creation
验证结果:符合预期,资源模块下因为某些原因,feign的模块都注入失败了
yml和系统模块比对
bootstrap.yml
和patrol模块比对,新增了这个配置
验证:重启项目还是不行
验证结果:没有影响,搬到api模块后依然可以调用和使用
验证结果:系统模块也可以调用这个模块。but,系统模块其他client竟然取不到了
意外的发现:就是这个上传下载的文件的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())));
}
}