Несколько GORM ValidationException после импорта из файла Excel - PullRequest
0 голосов
/ 24 февраля 2020

Я работаю над ошибкой. У меня есть файл Excel, который импортируется в приложение. Файл содержит информацию для основного объекта домена (Zoo, см. Ниже). Каждая строка имеет две ячейки, строковое значение для имени и значение int для количества животных.

Если у меня есть недопустимое поле в этом файле Excel, будет отображаться сообщение об ошибке типа "Ошибка при столбец X в ячейке Y. Значение "someValue" недопустимо ". Давайте предположим, что у нас есть файл Excel с 250 строками. Если в строке 200 есть недопустимая ошибка поля, в каждой строке, следующей за ней, выдается следующая ошибка

Validation error whilst flushing entity [com.rolotec.ost.Zoo]:
- Field error in object 'com.rolotec.ost.Zoo' on field 'ceo': rejected value [null]

Если я смотрю в БД, объект не является пустым поле ceo.

Здесь объекты домена.

class Zoo{   
  String name;
  int animalsInTheZoo;
  CEO ceo;
  hasMany=[ zooEnclosures : ZooEnclosures]
  constraints=[//some constraints]   
}

class CEO{
  Date ceoTillDate;
  Person person;
  constraints=[//some constraints]    
}

class Person{    
  String name;
  int age;
  constraints=[//some constraints]  
}

Служба импорта

class ImportService{

importExcel(){

    String errorMsg="";

    Zoo.withTransaction { status->   
        try{

            //some other operations 
            for(int rowNum = excelFile.firstRow; rowNum<=excelFile.lastRow; rowNum++) {  
            try {
                importRow(row);
            } catch (Exception e) {
                //doSomething
            }
           } //end for-loop
            if (errorMsg != "") {
                status.setRollback();
            }     
        } catch(Exception e){
            //doSomething with e
            status.setRollback();               
        }

    }           
}

importRow(Row row){    
    String name = row.getCell(1).stringCellValue;
    Zoo.findAllByName(name).each{    
        try{    
            //reads every cell in Excel data and validates the field
            it.save() //error occures here in the validation    
        } catch(Exception e){
            //doSomething with e
        }
    }
}

Если я проверю объект, он будет иметь значение для it.ceo.name, но остальное будет нулевым внутри it.ceo. Также будет it.ceo.person = null. В БД есть все значения для атрибутов.

РЕДАКТИРОВАТЬ: Если в файле Excel нет недопустимых полей, исключение ValidationException отсутствует. Все будет импортировано нормально.

РЕДАКТИРОВАТЬ 2: Добавлен for-l oop внутри метода importExcel ().

1 Ответ

0 голосов
/ 27 февраля 2020

Проблема заключалась в том, что внутри замыкания Zoo.withTransaction был for-l oop, который проходил по всем строкам в файле excel. Для решения мы переместили .withTransaction внутрь for-l oop, и проблема исчезла.

Код в ImportService теперь выглядит так:

  importExcel(){

   String errorMsg="";
   //some operations
   for(int rowNum = excelFile.firstRow; rowNum<=excelFile.lastRow; rowNum++){
      Zoo.withTransaction{status -> 
       //some operations
       try{
        importRow(row)
       } 
      catch(Exception e){
          //do something with exception
          status.setRollbackOnly()
       }
      }
     }

   }
...