【发布时间】:2015-12-21 05:41:34
【问题描述】:
我有一个应用程序,它基本上调用多个 Web 服务,存储从这些 Web 服务接收到的数据并将其呈现给用户。我有一个调用所有网络服务的异步任务,它看起来像这样:
List<Promise> t = new ArrayList<Promise>()
def TIMEOUT_TIME = 6
t[0] = task {
def responseFrom0 = webserviceRequestService.getResponse(0)
if(responseFrom0){
return responseFrom0
}
}
t[1] = task {
def responseFrom1 = webserviceRequestService.getResponse(1)
if(responseFrom1){
return responseFrom1
}
}
getResponse 动作如下所示:
List<ResponseResult> result = new ArrayList<TravelQuote>()
try {
wsClient = prepareRequestMap()
wsResponse = externalWebservice.getQuotes(wsClient)
wsResponse.responseList.each {
ResponseResult responseResult = new ResponseResult()
//populate properties of ResponseResult
responseResult.save(failOnError:true, flush:true)
result.add(responseResult)
}
} catch(Exception e){
log.error e.message
e.printStackTrace()
}
return result
最后,我收集来自所有网络服务的所有响应,如下所示:
result.each {
if(it){
try{
it=it.merge()
}catch (Exception e){
log.error("Error occured while merging responses... : ${e.message}")
}
}
}
现在,这里的问题是我从最后一段代码中得到了这个异常
非空属性引用空值或瞬态值:ResponseResult.dateCreated;嵌套异常是 org.hibernate.PropertyValueException:非空属性引用空值或瞬态值:ResponseResult.dateCreated
dateCreated 来自我在所有域类上实现的这个类。
abstract class AbstractPersistentObject implements Serializable{
static final long serialVersionUID = 1L;
Date dateCreated
Date lastUpdated
}
这个问题的奇怪之处在于,这只发生在生产环境中,无论我做什么,我都无法在任何其他环境中复制它。而且,一旦发生这种情况,每次运行代码时服务器都会抛出该特定问题,直到服务器重新启动。重启后,这段代码就可以正常工作了。
我的想法不多了,有人有什么想法吗?
【问题讨论】:
-
将 DTO 与您保存的域类分开不是更好吗?如果保存一个没有实现 Serializable 的域类会发生什么?
-
您是否尝试通过将
autoTimestamp true添加到每个具体域类中的映射块来强制启用自动时间戳功能? -
我尝试通过做,responseResult.dateCreated = new Date() 直接分配 dateCreated,这样做之后,我得到错误说它找不到空属性 'id'
标签: grails asynchronous grails-orm