在使用自动装配类的应用程序中自动装配失败,该应用程序又自动装配了FeignClient标记的类

时间:2019-08-23 10:51:29

标签: java spring-boot openfeign

根据我们的体系结构,我们有一组应用程序,这些应用程序使用很少的公共库(* -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。

0 个答案:

没有答案