com.easytha.Student条目中的Grails-null id(发生异常后不刷新会话)

时间:2014-01-08 10:34:39

标签: grails elasticsearch grails-domain-class grails-services

我已经看到了这个问题的几个主题,没有人可以解救 我在DomainClass中有以下内容

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

其中elasticsaerch是一项服务,我已将其添加到静态瞬态列表中。似乎在成功调用index方法之后它会抛出此异常

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 个答案:

答案 0 :(得分:2)

它刺伤了事情,但可能会将保存转移到交易中:

Student.withTransaction {
  student4.save()
}

我看到在服务之外做事时出乎意料地弹出(应该是,imo,在服务中)。

总结一些后续讨论:

学生模型已在整个应用程序中保存,因此不适合将所有保存转移到服务或包装在事务块中。 OP注意到将原始重建索引代码移动到新会话中将其固定在任何地方。

def afterInsert() {     
    elasticSearchService.index(this)

}