根据我们的体系结构,我们有一组应用程序,这些应用程序使用很少的公共库(* -sdks)。公共库中很少有@Service类使用@FeignClient进行注释。现在,我们使用带有netflix-core V <1.0.0>的Spring-boot V1.2.x,现在我们正在使用openFeign V <2.1.0>升级到Spring-bootV2.1.x。 / p>
作为此升级的一部分,所有相关的库(包括feign-client)也将进行更新。
在启动服务器时,我们最初会遇到问题,因为由于openFeign客户端bean和spring bean冲突,自动装配失败。为了避免这种情况,我们修改了@ComponentScan以排除存在openFeign客户端类的公共库中的软件包。通过进行此更改,我们可以启动未直接使用公共库中的任何bean的应用程序(@Autowiring)
很少有应用程序直接使用库中存在的bean(通过@Autowiring),并且由于自动装配失败,我们在升级它们时遇到了问题。由于公共库中的非openFeign客户端类在内部使用openFeign客户端类而在@ComponentScan中排除了该问题,因此发生了此问题。
试图更改openfeign的版本,但问题仍然存在
公共库
配置类
package com.XX.rest.api.config;
import org.springframework.cloud.openfeign.EnableFeignClients;
import feign.Request;
import feign.RequestInterceptor;
import feign.auth.BasicAuthRequestInterceptor;
@Configuration
@EnableFeignClients(basePackages = { "com.XX.rest.api" })
public class TFeignConfig {
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
从外部应用程序调用feignclient的服务类
package com.XXX.rest.api.client.v2;
@Service
@EnableCircuitBreaker
public class AppGetClientV2 {
@Autowired
AppGetApiServiceV2 appGetApiServiceV2;
public getElements(Integer applicationId, Integer componentId)
throws InterruptedException, ExecutionException, TimeoutException
{
return appGetApiServiceV2.getElements(applicationId, componentId);
}
}
假装班级
package com.XX.rest.api.service.v2;
import org.springframework.cloud.openfeign.FeignClient;
@FeignClient(name="xyz",url= "${services.xyz.url}"+"/app-get")
public interface AppGetApiServiceV2 {
@RequestMapping(value = "/app/component/{componentId}/elements", method =
RequestMethod.GET, produces = "application/json")
public List<ElementGroupDTO> getElements(@PathVariable("applicationId")
Integer applicationId,
@PathVariable("componentId") Integer componentId)
throws InterruptedException, ExecutionException,
TimeoutException;
}
主要应用
主类
package com.XX.app.design;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@ComponentScan("com.XX.app.design"})
public class XXApplication {
public static void main(String[] args) {
SpringApplication.run(XXXApplication.class, args);
}
}
服务等级
package com.XX.app.design.service;
@Service
public class AppService {
//Call to libarary , autowire fails here
@Autowired
AppGetClientV2 appGetClientV2;
@Transactional
public Boolean copyDesign()
{
if ()
appResponse = appGetClientV2.getElements();
}
}
申请无法开始
说明:
com.XX.design.service中的字段appGetClientV2。 AppService需要找不到类型为'com.XX.rest.api.client.v2.AppGetClientV2'的bean。
注入点具有以下注释: -@ org.springframework.beans.factory.annotation.Autowired(required = true)
操作:
考虑在您的配置中定义类型为“ com.XX.rest.api.client.v2.AppGetClientV2”的bean。