Как поймать проверку уникальности в Spring Boot 3JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как поймать проверку уникальности в Spring Boot 3

Сообщение Anonymous »

В моем проекте Spring Boot 3 с спящим режимом 6 я пытаюсь проверить, не используется ли имя перед обновлением (и сохранением) объекта.
Я хочу выйти из метода с аннотацией @Transactional, и я хочу иметь возможность передавать сообщение в пользовательский интерфейс в случае сбоя обновления/сохранения.
Существует ряд ответов, но у всех есть проблемы. Вот что я пробовал:
1. Перехват DataIntegtrityException
Этот способ создает собственное исключение. Минус в том, что он не работает с @Transactional

Код: Выделить всё

    //@Transactional - doesn't catch exception with @Transactional
public CarCreateDto updateCar(CarCreateDto updateCarDto, Long id) {
Car Car = CarRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Car with " + id + " not found"));
try {
CarMapper.partialUpdate(updateCarDto, Car);
CarRepository.save(Car);
return CarMapper.toDto(Car);
} catch (DataIntegrityViolationException e) {
throw new CarAlreadyExistsException("Car with name already exist");
}
}
2. Перехват исключения DataIntegtrityException с помощью saveAndFlush
То же, что и выше, но использует saveAndFlush и работает с @Transactional. Не могу найти ссылку, но проблема в том, что saveAndFlush использовать нецелесообразно.

Код: Выделить всё

    @Transactional
public CarCreateDto updateCar(CarCreateDto updateCarDto, Long id) {
Car Car = CarRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Car with " + id + " not found"));
try {
CarMapper.partialUpdate(updateCarDto, Car);
CarRepository.save(Car);
return CarMapper.toDto(Car);
} catch (DataIntegrityViolationException e) {
throw new CarAlreadyExistsException("Car with name already exist");
}
}
3. Запустите проверку базы данных перед сохранением
Минусом здесь является дополнительный вызов базы данных. Также возможны проблемы с параллелизмом.

Код: Выделить всё

    @Transactional
public CarCreateDto updateCar(CarCreateDto updateCarDto, Long id) {
Car Car = CarRepository.findById(id).orElseThrow(() -> new EntityNotFoundException("Car with " + id + " not found"));
boolean samename = updateCarDto.getName().equalsIgnoreCase(Car.getName());
if (samename || !samename && !CarRepository.existsByName(updateCarDto.getName())) {
CarMapper.partialUpdate(updateCarDto, Car);
CarRepository.save(Car);
return CarMapper.toDto(Car);
} else {
throw new DatabaseUniqueConstraintException("Car with name " + updateCarDto.getName() + " already exists");
}
}
4. Поместите ловушку на контроллер
Это просто кажется неправильным — контроллер не несет ответственности за перехват исключений БД.

Код: Выделить всё

@PutMapping(value = "/{id}", consumes = "application/json")
ResponseEntity updateCarDto(@Valid @RequestBody CarCreateDto updateCar, @PathVariable Long id) {
System.out.println("wait");
try {
CarCreateDto Car = CarService.updateCar(updateCar, id);
return new ResponseEntity(Car, HttpStatus.OK);
} catch (DataIntegrityViolationException e) {
throw new CarAlreadyExistsException("Car with name already exist");
}
}
Итак, как правильно обработать это исключение для проверки уникальности?

Подробнее здесь: https://stackoverflow.com/questions/772 ... ing-boot-3
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»