Нужна небольшая помощь по клиенту Spring Feign. Итак, вот ситуация,
У меня есть 2 службы загрузки Spring. Скажем, служба A и служба B. Я настроил свою службу A с клиентом Feign, через который я вызываю метод службы B.
Итак, вот код моей службы A,
Мой интерфейс конфигурации FeignCleint,
@FeignClient(name = "FeignClient", url = "http://localhost:8081/ServiceB/hello")
public interface FeignApi {
@RequestMapping(method = RequestMethod.GET)
ResponseEntity<?> hello();
}
И мой контроллер отдыха, который использует приведенную выше конфигурацию симуляции для вызова метода 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);
}
}
}
ниже мой контроллер для службы 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, используя
Служба B терпит неудачу, как и ожидалось. Теперь я ожидаю, что служба A должна получить ответ в форме ResponseEntity. Но на самом деле происходит то, что поток попадает в блок исключения вместо того, чтобы оставаться в блоке попытки. Я вижу напечатанную строку,
"Service A Exception block reached."
Вот чего я не понимаю. Если я управлял исключением службы B с помощью совета контроллера и отправил ответ службе A в форме ResponseEntity, то почему поток службы A попадает в блок catch. Я ожидаю, что он останется только в блоке try, поскольку я хочу продолжить обработку на основе данных.
Есть идеи, как мне обойти эту штуку? Или это будет так, даже когда я использую совет контроллера для управления исключениями? Каким должно быть ожидаемое поведение в этом случае?
Пожалуйста посоветуй.