Как лучше всего обрабатывать или генерировать исключения в приложении Spring Boot? - PullRequest
0 голосов
/ 28 января 2019

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

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Лучше создать пользовательский тип исключения, чем использовать ServletException.Для обработки исключения вы можете использовать @ControllerAdvice.Сначала создайте пользовательский тип исключения:

public class UserNotFoundException extends RuntimeException {

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

Предполагая, что ваш контроллер и служба выглядят более или менее так:

@RestController
@RequestMapping("users")
class UserController {

  private final UserService userService;

  UserController(UserService userService) {
    this.userService = userService;
  }

  @GetMapping
  List<String> users() {
    return userService.getUsers();
  }
}

@Service
class UserService {

  List<String> getUsers() {
    // ...
    throw new UserNotFoundException("User not found");
  }
}

Вы можете обрабатывать UserNotFoundException, используя @ControllerAdvice

@ControllerAdvice
class CustomExceptionHandler {

  @ExceptionHandler({UserNotFoundException.class})
  public ResponseEntity<Object> handleUserNotFoundException(UserNotFoundException exception) {
    return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND);
  }
}
0 голосов
/ 28 января 2019

Я предполагаю, что вы хотите перехватить все исключения, возникшие в вашем приложении.Spring-Boot предоставляет глобальный обработчик исключений, который корректно перехватывает все исключения и возвращает ответ в соответствии с конкретным исключением.Это дает вам гибкость, чтобы изменить коды состояния, данные ответа, заголовки соответственно.Несколько полезных ссылок для реализации этой функции -

1.) Dzone

2.) Spring Boot Tutorial

0 голосов
/ 28 января 2019

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

Таким образом, вы получите что-то вроде этого:

Контроллер, который вызывает толькосервисный метод (лучше не иметь никакой логики здесь)

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUserById(@PathVariable("id") Long id) {
        return userService.getById(id);
    }
}

A Service класс, который вызывает DAO класс (расширяющий JPARepository)

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDAO userDAO;

    @Override
    public User getById(Long id) {
        return userDAO.findById(id).orElseThrow(() -> new UserNotFoundException("No user with id = " + id + " found."));
    }
}

DAO:

@Repository
public interface UserDAO extends JpaRepository<User, Long> {
}

Примечание: возвращается Optional<Object>, что очень удобно.

И, наконец, ваше Exceptionкласс.

@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

Примечание: @ResponseStatus - при выдаче этого исключения будет возвращаться код состояния HTTP 404.

Это imho очень чистый и хороший способразвивайте свой отдых API.

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

0 голосов
/ 28 января 2019

Один из лучших способов или то, что я делаю, это:

  1. Проверка данных / параметров на допустимые данные (например, проверка нуля иногда вручную с помощью оператора if).
  2. Проверка данных / параметровдля размера (например, размер файла)
  3. проверка данных или параметров на допустимый диапазон, а также тип данных, выполните приведение типов, если не в допустимом типе (например, String, Long, Integer и т. д.).
  4. Поднимите сообщение и вернитесь к этому API, если данные / параметры недопустимы, прежде чем система выдаст исключение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...