Нужна небольшая помощь о клиенте Spring Feign.Итак, вот ситуация,
У меня есть 2 службы загрузки Spring.Допустим, Сервис A и Сервис B. Я настроил свой Сервис A с клиентом Feign, через который я вызываю метод Сервиса B.
Итак, вот код для моего Сервиса A,
My FeignCleintинтерфейс конфигурации,
@FeignClient(name = "FeignClient", url = "http://localhost:8081/ServiceB/hello")
public interface FeignApi {
@RequestMapping(method = RequestMethod.GET)
ResponseEntity<?> hello();
}
И мой контроллер покоя, который использует вышеуказанную конфигурацию feign для вызова метода Service B,
@RestController
public class ApiController {
@Autowired
private FeignApi feignApi;
@RequestMapping(value = "/callServiceB")
public ResponseEntity<?> companyInfo() {
ResponseEntity<?> response = new ResponseEntity("OK Response", HttpStatus.OK);
try {
response = feignApi.hello();
// Code for some other things related to application.
return response;
} catch (Exception ex) {
System.out.println("Service A Exception block reached.");
return new ResponseEntity(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
}
}
ниже - это мой контроллер для Service B,
@RestController
public class MyController {
@GetMapping("/hello")
public String hello() throws Exception {
if (true) {
throw new Exception("Service B Exception...");
}
return "Hello World";
}
}
И мой совет контроллера по обработке исключения, которое я выбрасываю вручную,
@ControllerAdvice
public class MyControllerAdvice {
@ExceptionHandler
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity<?> handleException(Exception exception, Model model) {
return new ResponseEntity<>("Caused due to : " + exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Теперь мой поток такой, как показано ниже. Как вы можете видеть, я вызываю службу B из службы A с использованием симметричного клиента,Моя служба B генерирует исключение вручную, которое я перехватываю, используя рекомендации контроллера, и отправляю детали исключения в качестве ResponseEntity обратно в вызывающую службу A. Чтобы служба A могла обрабатывать детали и двигаться на основе этого.
Проблема в том, что когда я нажимаю на вызов из Сервиса A, используя
http://localhost:8080/feign/callServiceB
Служба B завершается с ошибкой, как и ожидалось.Теперь я ожидаю, что Служба A должна получить ответ обратно в форме ResponseEntity.Но на самом деле происходит то, что поток входит в блок исключения, а не остается в блоке try.Я вижу напечатанную строку:
"Service A Exception block reached."
Это то, чего я не понимаю.Если я справился с исключением службы B, используя совет контроллера, и отправил ответ службе A в форме ResponseEntity, то как поток службы A войдет в блок перехвата.Я ожидаю, что он останется в блоке try, так как я хочу продолжить обработку на основе данных.
Любая идея, как мне обойти эту вещь?Или это так, даже если я использую совет контроллера для управления исключениями?Каким должно быть ожидаемое поведение в этом случае?
Пожалуйста, совет.