У меня есть два пути:
/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();
}
Таким образом, мне не нужно переводить Исключение, поскольку я уже знаю, что Студент не существует, чтобы я мог выдать пользовательское исключение.
Мои мысли в обоих подходах:
- Без проверки я уменьшаю код и количество раз, когда я запускаю свою базу данных;
- Проверяя, я точно знаю, почему яневозможно добавить адрес (ученик не существует) и может выдать пользовательское исключение без необходимости его перевода;
Какой из них лучше всего подходит для этого сценария?
Следует лиЯ жду, когда DAO сгенерирует Исключение, или я должен предотвратить его, проверив, существует ли Студент?