Сбой автопроводки в приложении, которое использует класс автопроводки, который, в свою очередь, помечает классы автопроводки FeignClient
Согласно нашей архитектуре, у нас есть набор приложений, которые используют несколько общих библиотек (*-sdks). Немногие классы @Service внутри общих библиотек снабжены аннотацией @FeignClient. Прямо сейчас мы используем Spring-boot V1.2.x с ядром netflix V<1.0.0>, и сейчас мы находимся в процессе обновления до Spring-boot V2.1.x с openFeign V<2.1.0>.
В рамках этого обновления также обновляются все связанные библиотеки, включая feign-client.
Изначально мы столкнулись с проблемами при запуске сервера, так как произошел сбой автоматической разводки из-за столкновения клиентского компонента openFeign и пружинного компонента. Чтобы избежать этого, мы изменили @ComponentScan, чтобы исключить пакеты в общих библиотеках, где присутствуют клиентские классы openFeign. Делая это изменение, мы можем вызвать приложения, которые не используют напрямую компоненты из общих библиотек (@Autowiring)
Есть несколько приложений, которые напрямую используют компоненты, присутствующие в библиотеке (через @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);
}
}
Feign класс
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();
}
}
Приложение не удалось запустить
Описание:
Поле appGetClientV2 в com.XX.design.service. Для AppService требуется компонент типа com.XX.rest.api.client.v2.AppGetClientV2, который не может быть найден.
Точка внедрения имеет следующие аннотации: - @org.springframework.beans.factory.annotation.Autowired(обязательно =true)
Действие:
Попробуйте определить bean-компонент типа com.XX.rest.api.client.v2.AppGetClientV2 в вашей конфигурации.