Azure documentDB - 具有指定 ID 或名称的资源已存在

use*_*764 5 azure document-database azure-java-sdk azure-cosmosdb

在我的应用程序的 Azure Cosmo DocumentDB 中,出现以下错误

2018-03-27 14:42:057 错误 chmsCosmosDBFruiteService - 无法将 Fruites 添加到客户参考:11416e34-3620-45a4-b3be-b845bbf41762
消息:{“错误”:[“具有指定 id 或名称的资源已存在。”] ActivityId:1b70b944-d581-4640-8785-819400433bb4,请求URI:/apps/8d13f597-c7e4-4d60-8713-8a0e9abaa9ac/services/ce0d287f-0125-482b-b32c-22108b5b0ed3/partition s/42c80a49-8042-4032-8cfd -9937ecea8dcc/replicas/131662740073245648p,RequestStats:,SDK:Microsoft.Azure.Documents.Common/1.21.0.0,StatusCode:冲突2018-03-27 14:42:058错误chmaeGlobalExceptionHandler - 异常:类org.apache.catalina.connector .ClientAbortException 消息:java.io.IOException:现有连接被远程主机强制关闭 2018-03-27 14:42:058 警告 oswsmmaExceptionHandlerExceptionResolver - 无法调用 @ExceptionHandler 方法:public java.util.Map com.hm。 myfeed.api.exception.GlobalExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest,javax.servlet.http.HttpServletRequest)org.apache.catalina.connector.ClientAbortException:java.io。 IOException:远程主机在 org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:356) 处强制关闭了 org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:815) 处的现有连接在 org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:720) 在 org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:391) 在 org.apache.catalina.connector.OutputBuffer.write (OutputBuffer.java:369)在org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96)在org.springframework.security.web.util.OnCommitedResponseWrapper $ SaveContextServletOutputStream.write(OnCommitedResponseWrapper.java:639)

我有点不明白这一点。异常发生在代码中,该代码首先检查集合是否存在(存在),然后检查是否不创建它。显然创建将失败,集合存在!

创建函数

try {
    fruitesDocument = documentClient.createDocument(getCollectionLink(), fruitesDocument , null, false).getResource();
} catch (DocumentClientException e) {
    LOG.error("Could not add fruits for Customer Reference: " + fruitesModel.getId() + "  " + e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

更新功能:

try {
    fruitesDocument = documentClient.replaceDocument(fruitesDocument , null).getResource();
} catch (DocumentClientException e) {
    LOG.error("Error while updating fruites: " + e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)

创建文档时遇到问题。

Saj*_*ran 3

使用DocumentClient.UpsertDocumentAsync而不是 documentClient.replaceDocumentAsync

如果文档尚不存在,Upsert 将创建一个文档,否则将覆盖它。替换要求文档已经存在,然后覆盖它。使用哪个是您的应用程序关心的问题。