Идентификатор 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)
}