2015-01-19 11 views
0
@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; 
} 

Два решения пришли на мой взгляд

  1. изменения подписи сохранить и отправить ValidationResult (или обернуть его в другой класс). В этом случае нам нужно управлять откатом, так как @Transactional не откатывает работу, когда мы не выбрасываем исключение

  2. Throw InvalidInputFileException, у которого есть validationResult на месте. (Причина, по которой мы хотим сохранить ValidationResult, нам нужно сообщить пользователю об ошибке проверки).

Я в пользу такого подхода, как правильно бросать исключение для противоречивых данных и во-вторых @Transactional будет работать нормально, и мы не должны управлять транзакциями. Тем не менее, я не видел переменную-член в классе Exception в коде раньше и хорошо ли это сделать?

Теперь один способ, которым я думал, было в случае ValidationFailure он бросает

class InvalidInputFileException extends RuntimeException { 
ValidationResult vr; 

} 
+0

так в чем ваш вопрос? –

ответ

3

Да, это нормально. Исключением является класс, и он может иметь переменные-члены и методы, подобные любому другому классу. Кстати, очень близким примером такого исключения является именно стандарт ConstraintValidationException, который вызывается стандартной базой проверки Bean, которая содержит набор нарушений ограничений.

Обычно принято делать исключения неизменными: его состояние устанавливается во время создания и никогда не изменяется после.