Проверьте, существует ли ресурс перед вставкой в ​​базу данных, или подождите, пока DAO не сгенерирует исключение? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть два пути:

  • /students
  • /students/{id}/addresses

... со следующим поведением:

  • POST до /students - 201 Created (при успешном создании ученика)
  • POST до /students/{id}/addresses - 201 Created (при успешном создании адреса под запрошенным пользователем)

Теперь представьте себе ситуацию, когда клиент POST до /students/12/addresses, но нет ученика с id = 12.

Как мне справиться с этим сценарием?

Должен ли я вставить без какой-либо проверки и подождать, пока Hibernate выдаст исключения, или перед вставкой я должен проверить наличие студента?

1-й параметр:

StudentController.java

@Autowired
private AddressService addressService;

@PostMapping("/students/{id}/addresses")
public ResponseEntity<?> handleRequestOfCreateAddressToStudent(@PathVariable("id") Long studentId, @RequestBody Address address) {
    address.setStudent(new Student(studentId));
    Address createdAddress = addressService.saveAddress(address);

    URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").build(createdAddress.getId());
    return ResponseEntity.created(location).build();
}

AddressService.java

@Autowired
private AddressRepository addressRepository;

public Address saveAddress(Address address) {
    // omitted for brevity...
    return addressRepository.save(address);
}

Таким образом, поскольку я использую Spring, приложение будетбросить DataIntegrityViolationException, потому что ограничение нарушено (нет ученика с таким идентификатором для привязки к этому адресу).И, поскольку мне нужно отправить ответ клиенту, мне нужно будет перевести выброшенное исключение.

2nd option:

StudentController.java

@Autowired
private StudentService studentService;

@Autowired
private AddressService addressService;

@PostMapping("/students/{id}/addresses")
public ResponseEntity<?> handleRequestOfCreateAddressToStudent(@PathVariable("id") Long studentId, @RequestBody Address address) throws StudentNotFoundException {
    Student student = studentService.findById(studentId);

    if(student == null)
        throw new StudentNotFoundException("message");

    address.setStudent(new Student(studentId));
    Address createdAddress = addressService.saveAddress(address);

    URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").build(createdAddress.getId());
    return ResponseEntity.created(location).build();
}

Таким образом, мне не нужно переводить Исключение, поскольку я уже знаю, что Студент не существует, чтобы я мог выдать пользовательское исключение.

Мои мысли в обоих подходах:

  1. Без проверки я уменьшаю код и количество раз, когда я запускаю свою базу данных;
  2. Проверяя, я точно знаю, почему яневозможно добавить адрес (ученик не существует) и может выдать пользовательское исключение без необходимости его перевода;

Какой из них лучше всего подходит для этого сценария?

Следует лиЯ жду, когда DAO сгенерирует Исключение, или я должен предотвратить его, проверив, существует ли Студент?

1 Ответ

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

Вы правы в своих 2 выводах, но я хотел бы добавить еще одну вещь, которую вы должны рассмотреть.Второй вариант будет хорошим выбором для вас только в том случае, если вы собираетесь выполнить какие-то конкретные действия при возникновении этой конкретной ситуации.Если вы просто будете регистрировать сообщение об ошибке, как и все остальные ошибки, то нет смысла отличать эту конкретную ситуацию от других.события в вашей бизнес-логике, затем перейдите к варианту 1. В противном случае - вариант 2.

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