Выдает исключение BadRequestException (ResponseEntity) и Catch Error, возвращает API отклика ResponseEntity (HTTPStatus.BadRequest) ReST - PullRequest
0 голосов
/ 27 сентября 2019

Я работаю над рефакторингом некоторого кода, который увеличен в приведенном ниже примере.Класс 'main' очень запутан этими блоками try / catch и скрывает то, что делает код.

Я не работаю с Spring, но использую JaxR для обработки исключений.Это будет запись ReST для службы или контроллера, но мы также делаем наши процессы doa здесь (я знаю, но только как это).Поэтому нам нужно вернуть ResponseEntity с необходимой информацией.

public restVerifyName(userId) {
    String name;
    try {
        string name = nameProvider.getName(userId)
    } catch (exception A) {
        return new errorResponseBuilder(errorCode, errorMessage, status);
    } catch (exception B) {
        return new errorResponseBuilder(errorCode, errorMessage, status);
    }

    if (name == null) {
      return new errorResponseBuilder(errorCode, errorMessage, status);
     }

    try {
        nameAuthenticator.verifyName(name)
    } catch (Exception B) {
        return new errorResponseBuilder(errorCode, errorMessage, status);
    }
    Return Response.Ok().entity(name);
}

private errorResponseBuilder(errorCode, errorMessage, status) {
    ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
    return new Response.status(status).entity(errorResponse);
}

Поэтому я хочу включить эти try / catch в приватные методы и сделать так, чтобы все было немного более самодокументированным.Моя замена примерно равна:

public restVerifyName() {
    String name = getName();
    if (!nameIsVerfied(name)  {
         return new errorResponseBuilder(errorCode, errorMessage);
    }
    Return Response.Ok().entity(name);
}

private String getName() {
    String name;
    try {
        name = nameProvider.getName()
    } catch (exception A) {
        return new errorResponseBuilder(errorCode, errorMessage);
    } catch (exception B) {
        return new errorResponseBuilderConflict(errorCode, errorMessage);
    }

    if (name == null) {
     return new errorResponseBuilderConflict(errorCode, errorMessage);
    }
    return name;
}

private boolean verifyName(name) {
    try {
        return nameAuthenticator.verifyName(name)
    } catch (Exception B) {
        return new errorResponseBuilderBadRequest(errorCode, errorMessage);
    }
    return false;
}


private errorResponseBuilderBadRequest(errorCode, errorMessage) {
    ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
    ResponseEntity response = Response.status(status).entity(errorResponse)
    throw new BadRequestException(response)
}

private errorResponseBuilderConflict(errorCode, errorMessage) {
    ErrorResponse errorResponse = errorResponseBuilder(errorCode, errorMessage)
    ResponseEntity response = Response.status(status).entity(errorResponse)
    throw new ConfictException(response)
}

Ответ получен одинаково на обеих станциях.

Независимо от каких-либо логических ошибок / форматирования и т. Д. Какой общий подход является наилучшим?Бросать исключения с ответами или возвращать ответы (в контексте этих примеров цель рефакторинга)

Это в большем масштабе с несколькими другими попытками / ловами, поэтому я чувствую, что удаление беспорядка из «основного» класса болееудобочитаемый.Вызывает ли исключение исключение с responseEntities и позволяет JaxR обрабатывать его?

Спасибо

1 Ответ

0 голосов
/ 27 сентября 2019

Общий подход состоит в том, чтобы генерировать исключение с необходимыми встроенными деталями.

Затем иметь глобальный обработчик исключений для преобразования исключения в ответ.

Для Jax-RS вы можете использовать ExceptionMapper, чтобы поймать исключения.

private String getName() {
    String name;
    //try {
        name = nameProvider.getName()
    // Only catch if exception is a checked exception or you need to transform the exception to another type with embedded detail
    // Runtime exception should generally not need to be caught here
    //} catch (exception A) {
    //    return new errorResponseBuilder(errorCode, errorMessage);
    //} catch (exception B) {
    //    return new errorResponseBuilderConflict(errorCode, errorMessage);
    //}

    if (name == null) {
       throw new ACustomErrorExceptionForThisKind(name);
    }
    return name;
}

public class ACustomErrorExceptionForThisKindMapper implements ExceptionMapper<E extends Throwable> {
   public Response toResponse(ACustomErrorExceptionForThisKind e) {
        ....
   }
}

...