Поддомен симулируемого клиента: неоднозначное отображение

#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);

}