Идентификатор Grails-null в записи com.easytha.Student (не очищать сессию после возникновения исключения)

Я уже видел несколько потоков по этой проблеме, и никто не мог спасти, у меня есть следующее в моем DomainClass

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:'sapan.parikh@eclinicalworks.com',password:'test123')
    student4.save(failOnError : true)

ОБНОВИТЬ

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

1 ответ

Решение

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

Student.withTransaction {
  student4.save()
}

Я видел это неожиданно, когда делал что-то вне сервисов (то есть, должно быть, в сервисах).

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

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

def afterInsert() {     
    elasticSearchService.index(this)

}

Другие вопросы по тегам