как сгенерировать оригинальное исключение, когда один api остальных вызывает другой api - PullRequest
0 голосов
/ 03 апреля 2019

В моем контроллере есть 2 (A и B) REST API.A может вызвать B с помощью RestTemplate.И A, и B выдают исключение, теперь A получает запрос, затем вызывают B и B, выдают исключение, но я получаю только 500 кодов состояния, подробности об исключении не возвращаются.

@Autowired
private RestTemplate internalRestRouter;

@PostMapping("/A")
public Object handleACommand(@RequestBody Map<String, Object> payload) throws CliException {
    return internalRestRouter.postForObject("http://localhost:8080/B", null, Object.class);
}

@PostMapping("/B")
public Object handleBCommand() throws CliException {
    throw new CliException("B Exception details");
}

Как я могу получить сведения об исключениибросил Б, когда я звоню А?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

@ Wd Ly предложение, которое я поддержал

Написание рекомендаций для контроллеров Разработчики опробовали множество способов заставить класс рекомендаций для контроллеров работать.После тяжелой работы они нашли следующие моменты, которые следует учитывать:

Создайте свои собственные классы исключений.Несмотря на то, что Spring предоставляет много классов, которые представляют общие исключения в приложении , лучше написать свои собственные или расширить существующие.Один совет по контроллеру для каждого приложения. Рекомендуется иметь все обработчики исключений в одном классе, вместо того, чтобы аннотировать несколько с помощью @ ControllerAdvice .Напишите метод handleException .Этот предназначен для аннотирования @ ExceptionHandler и будет обрабатывать все объявленные в нем исключения, а затем делегировать определенному методу-обработчику.Добавьте один обработчик метода на исключение.Представьте, что вы хотите обработать UserNotFoundException , а затем создать handleUserNotFoundException .Создайте метод, который отправляет ответ пользователю.Методы-обработчики предназначены для выполнения логики для обработки данного исключения, затем они будут вызывать метод, отправляющий ответ.Этот метод получит список ошибок в виде тела и конкретного HTTP-статуса.

@ControllerAdvice
    public class GlobalExceptionHandler {
        /** Provides handling for exceptions throughout this service. */
        @ExceptionHandler({ UserNotFoundException.class, ContentNotAllowedException.class })
        public final ResponseEntity<ApiError> handleException(Exception ex, WebRequest request) {
            HttpHeaders headers = new HttpHeaders();

            if (ex instanceof UserNotFoundException) {
                HttpStatus status = HttpStatus.NOT_FOUND;
                UserNotFoundException unfe = (UserNotFoundException) ex;

                return handleUserNotFoundException(unfe, headers, status, request);
            } else if (ex instanceof ContentNotAllowedException) {
                HttpStatus status = HttpStatus.BAD_REQUEST;
                ContentNotAllowedException cnae = (ContentNotAllowedException) ex;

                return handleContentNotAllowedException(cnae, headers, status, request);
            } else {
                HttpStatus status = HttpStatus.INTERNAL_SERVER_ERROR;
                return handleExceptionInternal(ex, null, headers, status, request);
            }
        }

        /** Customize the response for UserNotFoundException. */
        protected ResponseEntity<ApiError> handleUserNotFoundException(UserNotFoundException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
            List<String> errors = Collections.singletonList(ex.getMessage());
            return handleExceptionInternal(ex, new ApiError(errors), headers, status, request);
        }

        /** Customize the response for ContentNotAllowedException. */
        protected ResponseEntity<ApiError> handleContentNotAllowedException(ContentNotAllowedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
            List<String> errorMessages = ex.getErrors()
                    .stream()
                    .map(contentError -> contentError.getObjectName() + " " + contentError.getDefaultMessage())
                    .collect(Collectors.toList());

            return handleExceptionInternal(ex, new ApiError(errorMessages), headers, status, request);
        }

        /** A single place to customize the response body of all Exception types. */
        protected ResponseEntity<ApiError> handleExceptionInternal(Exception ex, ApiError body, HttpHeaders headers, HttpStatus status, WebRequest request) {
            if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
                request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
            }

            return new ResponseEntity<>(body, headers, status);
        }
    }
0 голосов
/ 03 апреля 2019

Используйте ControllerAdvice для обработки обоих исключений.

...