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

我正在做的是发送一组最初由同一存储库中的视图获取的对象 - 当然,这些对象确实有一个非空的 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 是否已设置。当散装对象扩展 CouchDbDocument 时,这会导致问题,而 CouchDbDocument 不允许多次设置 id。这认为这是一个错误,它将在 Ektorp 1.3.0 中修复

在 1.3.0 之前的解决方法是在您的 Product 类中覆盖setId并稍微放宽断言。

于 2012-05-27T07:41:19.487 回答