#spring-boot #spring-cloud-feign
#spring-boot #spring-cloud-симулировать #spring-cloud-feign
Вопрос:
Я использую Spring Boot 2.0.3.RELEASE
и openFeign:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Я объявил двух симулированных клиентов в своем проекте:
@FeignClient(name = "appleReceiptSandboxFeignClient",
url = "https://sandbox.itunes.apple.com",
configuration = Conf.class)
@RequestMapping(produces = "application/json", consumes = "application/json")
public interface AppleReceiptSandboxFeignClient {
@RequestMapping(value = "/verifyReceipt", method = RequestMethod.POST)
AppleReceiptResponseDTO sandboxVerifyReceipt(@RequestBody AppleReceiptRequestDTO dto);
}
@FeignClient(name = "appleReceiptFeignClient",
url = "https://buy.itunes.apple.com")
@RequestMapping(produces = "application/json", consumes = "application/json")
public interface AppleReceiptFeignClient {
@RequestMapping(value = "/verifyReceipt", method = RequestMethod.POST)
AppleReceiptResponseDTO productionVerifyReceipt(@RequestBody AppleReceiptRequestDTO dto);
}
Моя проблема в том, что даже если базовые URL-адреса и имя не совпадают, кажется, что фиктивные клиенты считаются конфликтующими.
java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.myproject.central.client.AppleReceiptSandboxFeignClient' method
public abstract com.myproject.central.client.dto.AppleReceiptResponseDTO com.myproject.central.client.AppleReceiptSandboxFeignClient.sandboxVerifyReceipt(com.myproject.central.client.dto.AppleReceiptRequestDTO)
to {[/verifyReceipt],methods=[POST],consumes=[application/json],produces=[application/json]}: There is already 'com.myproject.central.client.AppleReceiptFeignClient' bean method
public abstract com.myproject.central.client.dto.AppleReceiptResponseDTO com.myproject.central.client.AppleReceiptFeignClient.productionVerifyReceipt(com.myproject.central.client.dto.AppleReceiptRequestDTO) mapped.
Даже если эта ошибка сопоставления является неожиданной, я открыт для обходных путей.
Очевидно, что я не могу объявить две конечные точки в одном и том же притворном клиенте, потому что поддомен отличается, или, может быть, я что-то упускаю?
Мой вопрос: каким было бы самое простое обходное решение (если таковое имеется) с использованием только feign client?
Ответ №1:
При аннотировании интерфейса или класса с помощью @RequestMapping
Spring зарегистрирует обработчик, даже если у вас есть @FeignClient
аннотация. Вы можете обойти проблему, удалив аннотацию из интерфейса и используя ее только в методе.
@FeignClient(name = "appleReceiptSandboxFeignClient",
url = "https://sandbox.itunes.apple.com",
configuration = Conf.class)
public interface AppleReceiptSandboxFeignClient {
@RequestMapping(value = "/verifyReceipt", method = RequestMethod.POST, produces = "application/json", consumes = "application/json", pro)
AppleReceiptResponseDTO sandboxVerifyReceipt(@RequestBody AppleReceiptRequestDTO dto);
}
@FeignClient(name = "appleReceiptFeignClient",
url = "https://buy.itunes.apple.com")
public interface AppleReceiptFeignClient {
@RequestMapping(value = "/verifyReceipt", method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
AppleReceiptResponseDTO productionVerifyReceipt(@RequestBody AppleReceiptRequestDTO dto);
}