【问题标题】:Error during merge after async task异步任务后合并期间出错
【发布时间】: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


【解决方案1】:

答案似乎在于抛出的异常:外部 Web 服务返回的记录没有 dateCreated 字段的值。

根据我的经验,生产环境中的数据几乎总是包含缺失或格式不正确的值。您应该通过更改 ResponseResult.dateCreated 的定义以允许空值并在您的代码中处理这种情况来解决这一问题。

【讨论】:

  • Web 服务响应没有设置 dateCreated,它是在 AbstractPersistentObject 类插入记录之前自动设置的,我也尝试手动设置,但 id 字段出现相同的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多