java - 找不到使用 Feign throws bean 的微服务之间的通信
问题描述
我正在尝试让我的微服务 java spring boot 使用 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.
我不知道可能出了什么问题,我已经检查了所有声明的变量是否都在项目的属性中,并且我已经检查了导入,我不知道为什么它说 bean 中缺少某些东西。
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();
}
}
产品客户端存储库:
@FeignClient(name = "product-service", url = "${ms-product.url}", configuration = ProductOAuth2FeignConfig.class)
public interface ProductClientRepository {
@GetMapping(value = "/chunk")
Page<SaleProductDTO> getProducts(@RequestBody SearchProductDTO searchDTO);
}
产品OAuth2FeignConfig:
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;
}
应用程序属性:
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
推荐阅读
- reporting-services - 重复 SSRS 矩阵列标题 SSRS 2015
- vba - 我怎样才能使这个公式动态
- dart - 为 PaginatedDataTable 管理 DataTableSource 的最佳方法?
- powershell - 如何使用 BIND 工具和 nsupdate 编写 Powershell 脚本来更新 DNS 服务器?
- api - Android Studio XML 预览为空白
- if-statement - 结果和 if/else/return 语句 E0308 错误
- c# - 如何在 Xamarin.Forms 中为 ToolbarItem 制作自定义渲染器?
- javascript - 连接到数据库以创建图表
- python - 在 google colab 上安装 pycuda
- php - php:如何使用 composer 安装一个包