Проверка бизнес-логики в контроллере для обеспечения лучшего сообщения об ошибках - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть сервисный метод, который возвращает объект UserDto.Однако есть несколько ситуаций, когда запрос к контроллеру возвращает состояние HTTP, отличное от 200, но служба может возвращать только null или UserDto.

Это плохая практика, чтобы переместить часть бизнесалогика для контроллера и прямой вызов хранилища для возврата более подробных сообщений об ошибках, поскольку служба не может передать сообщение об ошибке контроллеру?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы также можете использовать @ControllerAdvice из Spring для обработки таких случаев, взгляните на приведенный ниже код. Надеюсь, это поможет вам вернуть подробные сообщения об ошибках в контроллер.

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class ApiExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(NoSuchUserException.class)
    public ResponseEntity<Object> handleNoSuchPinCodeException(
        NoSuchUserException ex) {
        ApiError apiError = new ApiError(HttpStatus.NOT_FOUND);
        apiError.setErrorMessage(ex.getMessage());
        return buildResponseEntity(apiError);
    }

    private ResponseEntity<Object> buildResponseEntity(ApiError apiError) {
        return new ResponseEntity<>(apiError, apiError.getStatus());
    }
}

public class NoSuchUserException extends Exception{         

    public NoSuchUserException (String message) {
        super(message);
    }

}

public class ApiError {

    private HttpStatus status;
    private String errorMessage;

    private ApiError() {
    }

    public ApiError(HttpStatus status) {
        this();
        this.status = status;
    }
    public ApiError(HttpStatus status, String errorMessage, Throwable ex) {
        this();
        this.status = status;
        this.errorMessage = errorMessage;
    }

    public HttpStatus getStatus() {
        return status;
    }

    public void setStatus(HttpStatus status) {
        this.status = status;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

}
0 голосов
/ 14 декабря 2018

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

@ExceptionHandler({ CustomerNotFoundException.class })
public ResponseEntity handleException(CustomerNotFoundException ex, WebRequest request) {
    ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getMessage(), request.getDescription(false));
    return new ResponseEntity<>(errorDetails, HttpStatus.NOT_FOUND);
}

Я не рекомендую переносить бизнес-логику на контроллер, посколькуКонтроллер - это больше компонент инфраструктуры, чем логика домена.Также рассмотрите возможность добавления другого протокола, например, двоичного протокола, который не будет использовать уровень контроллера.Вы можете пропустить свои проверки или бизнес-правила.

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