0

我已经看到了这个问题的几个线程,没有一个可以拯救我的 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) }哪个有效。

4

1 回答 1

2

它正在解决问题,但可能会将保存转移到事务中发生:

Student.withTransaction {
  student4.save()
}

当我在服务之外做事情时,我已经看到这个意外弹出(这应该,imo,在服务中)。

总结一些后续的讨论:

学生模型保存在整个应用程序中,因此不适合将所有保存转移到服务或包装在事务块中。OP 指出,将原始的重新索引代码移动到新会话中可以修复它。

def afterInsert() {     
    elasticSearchService.index(this)

}

于 2014-01-08T11:33:40.913 回答