Cosmosdb保存的数据无法在门户网站中找到,但可以从azure-documentdb-spring-boot-starter中找到

时间:2017-12-01 05:32:00

标签: java azure spring-boot azure-cosmosdb

我的项目正在使用azure-documentdb-spring-boot-starter:0.2.0与cosmosdb进行交互:

@Repository
public interface PingEasyRepo extends DocumentDbRepository<PingEasy, String> {
}


@Document(collection = "test")
public class PingEasy {
    @Id
    private String id;
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

代码运行,可以执行save和findAll。但是当我去azure portal和cosmosdb数据资源管理器时,数据没有出现。当我打开浏览器工具时,我看到

请求失败
  

“500内部服务器错误:对象引用未设置为对象的实例。”和例外:

Uncaught TypeError: xhr.getResponseHeader is not a function
    at Object.DocumentClientFactory._shouldForceRetry (DocumentClientFactory.js?v=1.17.110.1:12)
    at HttpRequest.xhr.onreadystatechange (documentdbclient-1.14.0.js?v=1.17.110.1:3287)
    at HttpRequest._onAjaxError (Request.js?v=1.17.110.1:42)
    at i (jquery.min.js:2)
    at Object.fireWith [as rejectWith] (jquery.min.js:2)
    at y (jquery.min.js:4)
    at XMLHttpRequest.c (jquery.min.js:4)

以下是我用来自动创建cosmodb的脚本:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "databaseAccountName": {
      "type": "string",
      "metadata": {
        "description": "The MongoDB database account name. Needs to be globally unique."
      }
    }
  },
  "variables": {},
  "resources": [
    {
      "apiVersion": "2015-04-08",
      "type": "Microsoft.DocumentDB/databaseAccounts",
      "kind": "MongoDB",
      "name": "[parameters('databaseAccountName')]",
      "location": "[resourceGroup().location]",
      "properties": {
        "databaseAccountOfferType": "Standard",
        "name": "[parameters('databaseAccountName')]"
      }
    }
  ]
}

2 个答案:

答案 0 :(得分:3)

问题是您正在创建MongoDB帐户并使用使用DocumentDB API编写数据的示例,如您链接的文章中所述。

  

Microsoft的Spring Boot Starter使开发人员能够使用通过使用DocumentDB API轻松与Azure Cosmos DB集成的Spring Boot应用程序。

MongoDB帐户旨在与MongoDB客户端和应用程序一起使用,而不是与DocumentDB API客户端和应用程序一起使用。

主要区别在于MongoDB所需的标识符字段是&#34; _id&#34;而DocumentDB / SQL帐户所需的标识符是&#34; id&#34;。当您通过MongoDB客户端(应用程序或使用其中一个MongoDB SDK的代码)将文档写入MongoDB帐户时,驱动程序/客户端会确保您的文档具有所需的&#34; _id&#34;现场或自动生成一个。当您使用DocumentDB API sdk / client和DocumentDB / SQL帐户时,sdk / client将自动生成所需的&#34; id&#34;字段。

Portal使用MongoDB客户端来读取MongoDB帐户中的文档,但是它无法读取文档,因为它们不是有效的MongoDB文档(没有所需的标识符)。如果您尝试使用自己编写的MongoDB应用程序读取文档,或者尝试使用像Robomongo或Mongo Chef这样的MongoDB客户端读取文档,则会遇到相同的错误。

在您的情况下,如果要使用Spring Boot示例,则需要创建DocumentDB / SQL帐户。在本文的屏幕截图中,您可以看到如何创建SQL帐户。

希望这有帮助。

答案 1 :(得分:0)

我尝试重现您的问题,但失败了。我按照这个official tutorial将Spring Boot Starter与Azure Cosmos DB DocumentDB API一起使用。

您可以参考下面的代码和我的步骤,这对我有用:

主类:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;


@SpringBootApplication
public class JayGongCosmosDbSpringBootProjectApplication implements CommandLineRunner{

    @Autowired
    private UserRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(JayGongCosmosDbSpringBootProjectApplication.class, args);
    }

    public void run(String... var1) throws Exception {
        final User testUser = new User("testId", "testFirstName", "testLastName");

        repository.deleteAll();
        repository.save(testUser);

        final User result = repository.findOne(testUser.getId());

        System.out.printf("\n\n%s\n\n",result.toString());
    }
}

用户类:

public class User {
    private String id;
    private String firstName;
    private String lastName;

    public User(String id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getId() {
        return this.id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format("User: %s %s", firstName, lastName);
    }
}

UserRepository类:

import com.microsoft.azure.spring.data.documentdb.repository.DocumentDbRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends DocumentDbRepository<User, String> {}

的pom.xml:

<dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-documentdb-spring-boot-starter</artifactId>
        <version>0.1.4</version>
</dependency>

然后我执行jar包并成功创建文档。

enter image description here

我注意到你使用的azure-documentdb-spring-boot-starter的版本是0.2.0而我使用的是0.1.4。我建议你改变版本再试一次。

希望它对你有所帮助。