Сбой автопроводки в приложении, которое использует класс автопроводки, который, в свою очередь, помечает классы автопроводки 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 в вашей конфигурации.

0 ответов

Другие вопросы по тегам