我有一个派生自 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 上运行)