0

Я уже видел несколько потоков по этому вопросу, и никто не мог спасти У меня есть следующий в моем DomainClassGrails-нуль идентификатор в записи com.easytha.Student (не сбрасывает сессии после того, как происходит исключение)

def afterInsert() {  
     elasticSearchService.index(this) 
} 

Где elasticsaerch - это сервис, и я добавил его в статический список переходных процессов. Кажется, что после вызова метода индексной успешно он бросает это исключение

Message: null id in com.easytha.Student entry (don't flush the Session after an exception occurs) 

Это код индексного метода

def index(object) { 
    try { 
     if(object==null) { 
      throw new NullPointerException() 
     } 
     if(!(object instanceof Collection || object instanceof Object[])) { 
      IndexResponse response = client.prepareIndex(grailsApplication.config.esIndexName, object.getClass().getName(),object.id.toString()) 
        .setSource((object as JSON).toString()) 
        .execute().actionGet() 
      println "object indexed successfully" 
     }else if(object instanceof Collection || object instanceof Object[]) { 
      for (var in object) { 
       index(var) 
      } 
     } 
    }catch(e) { 
     e.printStackTrace(); 
    } 
} 

«объект проиндексированы успешно» печатается в консоли.

bootstrap.groovy имеет следующие

Student student4 = new Student(firstName:'Sapan',lastName:'Parikh',email:'[email protected]',password:'test123') 
    student4.save(failOnError : true) 

UPDATE

Я попытался Student.withNewSession { elasticSearchService.index(this) }, который работал.

+0

что вы делаете в вашем Bootstrap.groovy? вы не укажете здесь код – Motilal

+0

@Motilal Добавлен код начальной загрузки, это простая операция сохранения. Также нет ошибок проверки, я проверил их, напечатав this.errors – Sap

+0

добавьте флеш в свой файл save() и попробуйте перезагрузить приложение student4.save (flush: true, failOnError: true) – Motilal

ответ

2

Это колющие на вещи, но, возможно, смещать сохранить происходит внутри транзакции:

Student.withTransaction { 
    student4.save() 
} 

Я видел это выскакивают неожиданно, когда делать вещи за пределами услуг (которые должны, имо, быть в сфере услуг) ,

Подводя некоторые последующее обсуждение:

Модель студента была сохранена во всей программе, поэтому он не подходит переложить все сейвы на услуги или завернуть в блоках транзакций. OP отмечает, что перемещение исходного кода переиндексации в новый сеанс фиксировало его повсюду.

def afterInsert() {  
    elasticSearchService.index(this) 

}

+0

Да, вы правы, это решило проблему начальной загрузки, но student.save посыпался по всей базе кода. Должен ли я изменить его повсюду? – Sap

+1

Он работал с Student.withNewSession {elasticSearchService.index (this)} – Sap

+0

Это, вероятно, решит проблему, имеющуюся у меня в коде кода GPars, спасибо! –