非常に難しいバグがあります。 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の目標は以下のとおりです。
- クライアントは、クライアントが結果の直列化復元にはエラーを取得しません、すべての注文
- を取得します。
私はJavaシリアル化の経験を持ち、RMIが私を助けてくれることを願っています。
はい私は同じ 'serialVersionUID'を使用します – dit
しかし、クライアントはequalsの新しい実装を取得するのでしょうか、それとも彼自身の古い「DomainOrder」を使用しますか? – dit
@ditクライアントはクラスパス上で利用可能なクラスのバージョンを取得します。すでにコードベース機能を使用していない限り、RMIはそれを手助けすることはできません。 – EJP