Рекомендуется ли создавать исключение для передачи ответного сообщения пользователю в API? - PullRequest
0 голосов
/ 01 марта 2019

У нас есть микросервисная архитектура, которая состоит из модуля сервера основных приложений и модулей libs.На главном сервере приложений мы просто принимаем запрос и предоставляем ответ через объект запроса и ответа на методы REST API, которые вызывают уровни обслуживания, доступные в модуле libs.

  parent--
       ------apps
                ---server
                       ---Controller Class
       ------libs
                ---core
                       ---Service Layer
                       ---Dao Layer

Для распространения сообщений об ошибках, чтобы онимогут быть отправлены клиентам с использованием объекта ответа (доступно только в классах контроллера), мы создаем пользовательские исключения на уровне обслуживания, чтобы мы могли отправлять сообщения об ошибках в классы контроллера.Проблема с этим подходом заключается в том, что мы генерируем исключение во всех случаях. В качестве примера мы генерируем исключение, даже когда ввод неправильный или когда у пользователя нет разрешения, где мы можем просто вернуть пользователю ответ с сообщением об ошибке.

Мой вопрос заключается в том, что - Правильно ли выбрасывать пользовательское исключение только ради распространения сообщений об ошибках из уровня обслуживания в контроллер?Если НЕТ, то как мы можем распространить сообщение об ошибке на уровень контроллера?

Уровень обслуживания ---

public String serviceLayerMethod(String param) throws AssetException {
    try {
        if(param==null){
        throw new CustomException;
          } else{
          return param;
        }
    } catch (CustomException e) {
        LOGGER.error(CustomExceptionEnum.PARAMNULL_EXCEPTION.getMessage(),e);
        throw new CustomException(CustomExceptionEnum.PARAMNULL_EXCEPTION.getMessage(), e);
    }
}

КонтроллерСлой ---

public Response restAPI(Request request) {
    try {
        response.setMessage(service.serviceLayerMethod());
        response.setSuccess(true);
    } catch (CustomException e) {
        response.setMessage(e.getMessage());
        response.setSuccess(false);
    }
    return response
}

Ответы [ 4 ]

0 голосов
/ 04 марта 2019

Как указал Невилл;это дискуссионная тема, и нет ничего действительно правильного или неправильного ..

Мое мнение таково, что API должен быть независимым от пользовательского интерфейса .. Так что, если исключение выдает исключение ... все в порядке, чтобы отбросить его обратно ...и пусть клиент справится с этим или решит, что делать с этим исключением. Потому что некоторые клиенты могут захотеть показать красивое удобное для пользователя сообщение;в то время как другому клиенту может потребоваться фактическое сообщение (например, если другой API вызывает этот API).

0 голосов
/ 01 марта 2019

Я не вижу никаких проблем с этим, но вы можете лучше использовать Spring, чтобы сделать это для вас в своем API отдыха.

В Spring вы можете использовать @RestControllerAdvice и @ExceptionHandlerпоймать любое исключение и вернуть приятное сообщение для пользователя.Нравится:

@Slf4j
@RestControllerAdvice
public class ErrorHandlerController {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ApiErrorResponse> handleApiException(CustomException ex, Locale locale) {
        log.error("Custom error catch with the code {}", ex.getErrorCode(), ex);
        ApiErrorResponse error = new ApiErrorResponse(ex, locale);
        return new ResponseEntity<>(error, ex.getHttpStatus());
    }
}
0 голосов
/ 04 марта 2019

Это сложная и тонкая тема - она ​​вполне может быть основана на мнении.

Во-первых, избегайте использования исключений для передачи логики приложения.Ваш пример не предполагает, что вы делаете это, но часто пользовательские исключения используются для передачи логики приложения или домена, и обработка этого в блоке try / catch сложна для чтения, тестирования и развития.Например, если покупка не удалась из-за того, что клиент превысил свой кредитный лимит (бизнес-правило), я бы не использовал настраиваемое исключение для управления этим экземпляром.

Во-вторых, попробуйте использовать встроенные исключениявместо того, чтобы создавать свой собственный.Java имеет несколько встроенных исключений для проверки параметров;Вы не добавляете никакой ценности, дублируя их.Создавайте пользовательские исключения только в том случае, если вы не можете найти встроенное исключение Java.

В-третьих, попробуйте обрабатывать исключения приложений на уровне контроллера, если можете - проталкивание всего на уровень службы усложняет этот уровень.и сложнее в тестировании.

Наконец, сосредоточьтесь на том, как вы сообщаете свои ошибки своему клиенту - обычным делом является использование кодов ошибок HTTP.В конечном итоге вы можете в конечном итоге преобразовать свое собственное исключение в код «HTTP: 500», и вы захотите, чтобы ваши клиентские приложения могли согласовывать эти исключения согласованным образом.

0 голосов
/ 01 марта 2019

Я думаю, что имеет смысл зарегистрировать ошибку и просто отобразить ошибку HTTP с ошибкой, например, BAD_REQUEST или INTERNAL_SERVER_ERROR ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...