2016-09-12 11 views
0

非常に難しいバグがあります。 equals - ドメインオブジェクトDomainOrderのメソッドが正しく実装されていませんでした。問題は、ドメインオブジェクトがクライアントを含めて使用されていることです。すべての古いバージョン。したがって、クライアントも更新する必要があります。javaシリアル化|サーバー側でドメインオブジェクトの実装を変更する

クライアントは、私たちはできるだけ早くそれを修正する必要がありますが、あまりにも多くのクライアントが存在するRMI(JEE-6)

を介してサーバと通信します。だから私たちの考えは、という一時的にの問題をサーバー側で修正することでした。しかし、私はそれが動作するかどうかは分かりません。

現在の状況、当社の結果Setは異なるオブジェクトに対してequals戻りtrueを引き起こし、ただ一つのオブジェクトが含まれています。私は、サーバー側でそれを修正する方法を

[...] 
List<DBOrder> list = orderService.getOrders(criteria); 
Set<DomainOrder> orders = new HashSet<>(); 
for(DBOrder dborder : list){ 
    orders.add(convertDBOrderToDomain(dborder)); // mapping new DomainOrder(..) 
} 
[...] 

List<DBOrder> list = orderService.getOrders(criteria); 
Set<DomainOrder> orders = new HashSet<>(); 
for(DBOrder dborder : list){ 
    final DomainOrder domainOrder = convertDBOrderToDomain(dborder); 

    // temp fix for all old versions. 
    orders.add(new DomainOrder(){ 

     private DomainOrder delegate = domainOrder ; 

     @Override 
     public Long getId(){ 
      return delegate.getId(); 
     } 
     [...] 

     @Override 
     public boolean equals(){ 
      return [fix]; 
     } 

    }); 
} 

だから、あなたが何をすべきかそれは動作すると思いますか? iImportantの目標は以下のとおりです。

  1. クライアントは、クライアントが結果の直列化復元にはエラーを取得しません、すべての注文
  2. を取得します。

私はJavaシリアル化の経験を持ち、RMIが私を助けてくれることを願っています。

答えて

0

重要な目標は以下のとおりです。

  1. クライアントは単にあなたがequals()を再実装する方法の問題だすべての注文

を取得します。

  1. クライアントは、結果の逆シリアル化でエラーを表示しません。あなたが心配クラスのserialVersionUIDを変更しないことを要求する

。それがない場合はserialverツールからの前に変更してください。

+0

はい私は同じ 'serialVersionUID'を使用します – dit

+0

しかし、クライアントはequalsの新しい実装を取得するのでしょうか、それとも彼自身の古い「DomainOrder」を使用しますか? – dit

+1

@ditクライアントはクラスパス上で利用可能なクラスのバージョンを取得します。すでにコードベース機能を使用していない限り、RMIはそれを手助けすることはできません。 – EJP

関連する問題