1

org.ektorp.support.CouchDbDocument から派生したクラスがあります。

@TypeDiscriminator( value="doc.type == 'TYPE_PRODUCT' )
public class Product extends CouchDbDocument { 
....

リポジトリ クラスもあります。

public class ProductRepo extends CouchDbRepositorySupport<Product> { ....

リポジトリ クラスには次のメソッドがあります。

public List<DocumentOperationResult> executeBulk( Set<Product> bulk ) {
    return db.executeBulk( bulk );
}

このメソッドは、アイテムの作成と更新に使用されます。作成はうまくいきます。しかし、更新時に、Ektorp は次の例外をスローします。

Caused by: java.lang.IllegalStateException: cannot set id, id already set
    at org.ektorp.support.CouchDbDocument.setId(CouchDbDocument.java:39)
... 18 more

私がやっていることは、同じリポジトリ内のビューによって最初にフェッチされた一連のオブジェクトを送信することです。もちろん、オブジェクトには null 以外の ID があります。オブジェクトにはIDがあり、作成ではなく更新する必要があるため、これはもちろん発生しないはずです。Ektorp のドキュメントによると、db.executeBulk はドキュメントの作成と更新の両方を処理する必要があります。

CouchDbDocument.setId で例外がスローされています。

@JsonProperty("_id")
public void setId(String s) {
  Assert.hasText(s, "id must have a value");
  if (id != null && id.equals(s)) {
    return;
  }
  if (id != null) {
    throw new IllegalStateException("cannot set id, id already set");
  }
  id = s;
}

しかし、なぜ ?送信されたオブジェクトには実際に ID が設定されている (リビジョンも設定されている) ため、Ektorp は既存のオブジェクトについて話していることを検出し、それらの新しい ID を生成しようとしません。これを修正する方法を知っている人はいますか、またはこの場合、Ektorpを捨ててhttp経由で純粋なjsonを使用する解決策はありますか?

(Jboss 7.1.1.Final、CouchDB 1.2.0、Ektorp 1.2.2 で実行されているプロジェクト)

4

1 に答える 1

0

Ektorp の一括操作応答ハンドラーは、ID が既に設定されているかどうかを確認しません。これは、一括オブジェクトが ID を複数回設定できない CouchDbDocument を拡張する場合に問題を引き起こします。これはバグだと思います。Ektorp 1.3.0 で修正される予定です。

1.3.0 までの回避策は、Product クラスでsetIdをオーバーライドし、アサーションを少し緩和することです。

于 2012-05-27T07:41:19.487 に答える