@Transactional //Spring transactional
void saveFile(ExcelFile file) {
//Each sheet have different kind of entities and it is an ordered insert and first insert is needed before the second set of inserts
for(each sheet in excel file) {
List<Entity> entityList = convertIntoEntities(sheet);
ValidationResult vr = validateEntities(entityList);
saveEntities(entityList);
}
ValidationResult validateEntities(List<Entity> entityList) {
validator.validate(entityList) // The new validation we need to do before
}
void saveEntities(List<Entity> entityList) {
dao.saveEntities(entityList);
}
Здесь список сущностей формируется после чтения файла excel, и мы добавляем логику проверки файла excel. Мы не можем просто проверить excel самостоятельно, нам нужно прочитать существующие записи базы данных до проверки.Наличие переменной-члена в классе исключений
Теперь валидатор проверяет excel, где нам нужно посмотреть существующие сущности (из какой-либо другой таблицы) в базе данных (это не внешнее ограничение, имеется некоторая бизнес-логика) и создает список validationErrorMessages для каждого недопустимого организация.
Структура класса валидации является
ValidationResult {
boolean isValid;
List<String> errorMessage;
}
Два решения пришли на мой взгляд
изменения подписи сохранить и отправить ValidationResult (или обернуть его в другой класс). В этом случае нам нужно управлять откатом, так как @Transactional не откатывает работу, когда мы не выбрасываем исключение
Throw InvalidInputFileException, у которого есть validationResult на месте. (Причина, по которой мы хотим сохранить ValidationResult, нам нужно сообщить пользователю об ошибке проверки).
Я в пользу такого подхода, как правильно бросать исключение для противоречивых данных и во-вторых @Transactional будет работать нормально, и мы не должны управлять транзакциями. Тем не менее, я не видел переменную-член в классе Exception в коде раньше и хорошо ли это сделать?
Теперь один способ, которым я думал, было в случае ValidationFailure он бросает
class InvalidInputFileException extends RuntimeException {
ValidationResult vr;
}
так в чем ваш вопрос? –