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 で実行されているプロジェクト)