Как обрабатывать ошибки в проекте Spring- MVC без, если еще? - PullRequest
0 голосов
/ 26 апреля 2020

Я не могу понять, как обработать следующую ошибку:

В классе CustomerService я удаляю клиента по id, и если такого id не существует, то возникает ошибка должен быть брошен! Как обойтись без конструкции if else?

CustomerService:

// Delete customer
    public void deleteCustomer(Long id){
            Customer customer = customerRepository.getByIdAndUserRole(id, "customer");
            customerRepository.delete(customer);
        }

CustomerController:

// DELETE MAPPING
    //
    // Delete customer with ID
    @DeleteMapping("/customers/{id}")
    void deleteCustomer(@PathVariable Long id) {
        customerService.deleteCustomer(id);
    }

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

Попробуйте использовать Controller Advice. Всякий раз, когда возникает исключение, оно будет обработано непосредственно обработчиком. Нет, если / else или try / catch понадобятся.

1) Создайте класс CustomerControllerHandler, аннотируйте с помощью @ ControllerAdvice.

2) Теперь создайте методы с аргументами, имеющими тип Exception.

3) Методы вернут нужный вам JSON / POJO / void.

4) Аннотируйте методы с помощью @ExceptionHandler (Exception.class) и @ResponseStatus (HttpStatus.BAD_REQUEST),

@ControllerAdvice
public class CustomerControllerHandler {
     @ExceptionHandler(Exception.class)
     @ResponseStatus(HttpStatus.BAD_REQUEST)
     public void processException(Exception ex) {
     }
}
0 голосов
/ 26 апреля 2020

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

Например, вы можете проверить ответ удаления и выбросить ошибку в соответствии с приведенным ниже.

if (deleteCount == 0) {
  //throw error here
}

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

Удачи и счастливого обучения!

0 голосов
/ 26 апреля 2020

Вместо этого вы можете попробовать this . Это deleteById метод для CrudRepository (надеюсь, вы его используете), и он выдает IllegalArgumentException, если не может найти клиента.

Я предположил, что с "ошибкой" вы имели в виду " исключение ", а затем в контроллере вы можете окружить блок try-catch следующим образом:

try{
    customerService.deleteCustomer(id);
} catch (IllegalArgumentException e) {
    log.error("No customer id exists!", e); 
    // if you have no logger, then use System.out.println() at least
}

Если вы хотите вместо этого вернуть ошибку вызывающей стороне, измените тип данных с void на HttpResponse<String> и при обнаружении исключения вы можете return HttpResponse<>("No customer exists with that id!", HTTP.BAD_REQUEST). Теперь вызывающая сторона получит запрос с ошибкой 400.

Более хороший подход - перехватить исключение в самой службе и вернуть логическое значение контроллеру (true, если клиент удален, и false, если не удалось удалить / не смог найти).

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