2015-12-21 38 views
5

私は、基本的に複数の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 

と終了時に、私はからすべての応答を収集私はすべてのWebサービスを呼び出すと、それは次のようになります非同期タスクを持っていますこのように、すべてのWebサービスは:

result.each { 
     if(it){ 
      try{ 
       it=it.merge()          
      }catch (Exception e){ 
       log.error("Error occured while merging responses... : ${e.message}") 
      } 

     } 
    } 

は今、ここでの問題は、私は、コードの最後のブロックからこの例外を取得している

not-nullプロパティがnullまたは一時的な値を参照しています。ResponseResult.dateCreated;ネストされた例外はorg.hibernate.PropertyValueExceptionです:not-nullプロパティはNULL値または一時的な値を参照しています:ResponseResult.dateCreated

dateCreatedは私のすべてのドメインクラスで実装したこのクラスに由来します。

abstract class AbstractPersistentObject implements Serializable{ 
    static final long serialVersionUID = 1L;  
    Date dateCreated 
    Date lastUpdated  
} 

この問題についての奇妙なことは、これが唯一の本番環境で発生し、関係なく、私は何をすべきか、私は他の環境でこれを複製することはできませんされています。また、一旦これが起こると、サーバは、コードが実行されるたびにサーバが再起動されるまで、その特定の問題を投げるだけです。再起動後、このコードは正常に動作します。

アイデアが不足していますが、誰もがアイデアを持っていますか?

+0

保存しているドメインクラスからDTOを分離する方が良いでしょうか? Serializableを実装していないドメインクラスを保存するとどうなりますか? –

+0

具体的なドメインクラスのマッピングブロックに 'autoTimestamp true'を追加して、autoTimestamp機能を強制的に有効にしようとしましたか? –

+0

これを実行した後、responseResult.dateCreated = new Date()を実行してdateCreatedを直接割り当てようとしましたが、nullプロパティ 'id'を見つけることができないというエラーが発生しました –

答えて

2

答えがスローされた例外のようです:外部Webサービスは、dateCreatedフィールドの値のないレコードを返します。

私の経験では、実稼働環境からのデータには、ほとんどの場合、欠落値または不適切な形式の値が含まれています。そのためには、ResponseResult.dateCreatedの定義を変更してヌル値を許可し、コード内でこのシナリオを処理する必要があります。

+0

Webサービスの応答でdateCreatedが設定されていません。自動的にAbstractPersistentObjectクラスでレコードを挿入する直前に、私は手動で設定しようとしましたが、idフィールドに同じエラーがありました。 –