我已经看到了这个问题的几个主题,没有人可以解救 我在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) }
。
答案 0 :(得分:2)
它刺伤了事情,但可能会将保存转移到交易中:
Student.withTransaction {
student4.save()
}
我看到在服务之外做事时出乎意料地弹出(应该是,imo,在服务中)。
总结一些后续讨论:
学生模型已在整个应用程序中保存,因此不适合将所有保存转移到服务或包装在事务块中。 OP注意到将原始重建索引代码移动到新会话中将其固定在任何地方。
def afterInsert() {
elasticSearchService.index(this)
}