无法找到使用 Feign 抛出 bean 的微服务之间的通信

Communication between microservices using Feign throws bean could not be found

我正在尝试让我的微服务 java spring 启动以使用 Feign 与另一个微服务通信,但我在启动应用程序时收到此消息:

APPLICATION FAILED TO START
***************************
Description: Parameter 0 of constructor in ProductService required a bean of type ProductClientRepository' that could not be found.

Action: Consider defining a bean of type 'ProductClientRepository' in your configuration.

我不知道会出什么问题,我已经检查了所有声明的变量是否都在项目的属性中并且我已经检查了导入,我不知道为什么它说豆.

pom.xml:

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-oauth2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

销售服务:

@Service
@RequiredArgsConstructor
public class SaleService {

 private final ProductService productService;

 @Transactional
    public Sale createSale(Sale sale) {

        Set<Long> codesFromRequest = sale.getProducts().stream().map(p -> p.getCode())
                .collect(Collectors.toSet());
        validateProduct(codesFromRequest);

       return saleRepository.save(sale);
       
    }

    public void validateProduct(Set<Long> codesFromRequest) {
        List<SaleProductDTO> products = productService.findProduct(codesFromRequest);

        Set<Long> returnedCodes = products.stream().map(p -> p.getCode()).collect(Collectors.toSet());

        throwExceptionIf(validateSizeList(codesFromRequest, returnedCodes),
                new ProductNotFoundException());
    }

    public boolean validateSizeList(Collection<?> codesFromRequest, Collection<?> returnedCodes) {
        return codesFromRequest.size() != returnedCodes.size();
    }

}

产品服务:

@Service
@Slf4j
@AllArgsConstructor
public class ProductService {

    private final ProductClientRepository productRepository;

    @Retryable(value = { Exception.class }, maxAttempts = 3, backoff = @Backoff(delay = 50))
    public List<SaleProductDTO> findProduct(Set<Long> codes) {

        Page<SaleProductDTO> resultPage;

        try {
            var search = SearchProductDTO
                    .builder()
                    .codes(codes)
                    .build();

            resultPage = productRepository.getProducts(search);
        } catch (FeignException f) {
            return Collections.emptyList();
        }

        return resultPage.getContent();
    }
}

ProductClientRepository:

@FeignClient(name = "product-service", url = "${ms-product.url}", configuration = ProductOAuth2FeignConfig.class)
public interface ProductClientRepository {

    @GetMapping(value = "/chunk")
    Page<SaleProductDTO> getProducts(@RequestBody SearchProductDTO searchDTO);
}

ProductOAuth2FeignConfig:

public class ProductOAuth2FeignConfig {

    @Autowired
    private ProductConfig productConfig;

    @Bean
    public RequestInterceptor stockOAuth2RequestInterceptor() {
        return new OAuth2FeignRequestInterceptor(new DefaultOAuth2ClientContext(), resource());
    }

    private OAuth2ProtectedResourceDetails resource() {
        ClientCredentialsResourceDetails resource = new ClientCredentialsResourceDetails();
        resource.setAccessTokenUri(productConfig.getTokenUri());
        resource.setClientId(productConfig.getTokenClientId());
        resource.setClientSecret(productConfig.getTokenClientSecret());
        resource.setGrantType(productConfig.getTokenGrantType());
        resource.setScope(List.of(productConfig.getTokenScope()));

        return resource;
    }
}

产品配置:

@Data
@Configuration
@ConfigurationProperties(prefix = "ms-product")
public class ProductConfig {

    private String tokenUri;
    private String tokenGrantType;
    private String tokenClientId;
    private String tokenClientSecret;
    private String tokenScope;
}

application.properties:

external.api=https://myadress.com/api

ms-product.url=${external.api}/products
ms-product.token-uri=${external.api}/products/oauth2/token
ms-product.token-grant-type=client_credentials
ms-product.token-client-id=client-id-value
ms-product.token-client-secret=secret-value
ms-product.token-scope=read

feign.client.config.default.connect-timeout=3000
feign.client.config.default.read-timeout=7000

看来您需要添加@EnableFeignClients 注释。请参考Spring Boot OpenFeign