移动后端入门subscribeToCloudMessage将无法正常工作

 小湿基_517 发布于 2023-01-20 15:22

当我使用带有CloudBackendMessaging.TOPIC_ID_BROADCAST的subscribeToCloudMessage()函数作为在CloudBackendFragment.java中完成的topicId时,一切正常但是当我给这个函数我自己的字符串时,我收到以下消息:

错误:

m.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request

"code": 400,
"errors": [
  {
    "domain": "global",
    "message": "SubscriptionIDs: String properties must be 500 characters or less.  Instead, use com.google.appengine.api.datastore.Text, which can store strings of any length.",
    "reason": "badRequest"
  }
],
"message": "SubscriptionIDs: String properties must be 500 characters or less.  Instead, use com.google.appengine.api.datastore.Text, which can store strings of any length."

at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:111)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:38)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:312)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1042)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
at com.google.cloud.backend.core.CloudBackend.list(CloudBackend.java:314)
at com.google.cloud.backend.core.CloudBackendAsync.access$8(CloudBackendAsync.java:1)
at com.google.cloud.backend.core.CloudBackendAsync$9.callBackend(CloudBackendAsync.java:270)
at com.google.cloud.backend.core.CloudBackendAsync$9.callBackend(CloudBackendAsync.java:1)
at com.google.cloud.backend.core.CloudBackendAsync$BackendCaller.run(CloudBackendAsync.java:402)

Juniper.. 5

此错误消息表示该属性SubscriptionIDs(您可以_DeviceSubscription在数据存储区中的Kind 下找到它)超过500个Unicode字符限制.阅读文档以供参考.

来自文档:

对于文本字符串和未编码的二进制数据(字节字符串),数据存储区支持两种值类型:

    短字符串(最多500个Unicode字符或字节)被编入索引,可用于查询过滤条件和排序顺序.

    Longstrings(最多1兆字节)未编入索引,不能用于查询过滤器和排序顺序.

发生这种情况的原因是MBS试图将所有订阅写入一个属性.

因此,要解决这个问题,我们需要使用Text替代String型MBS后端的源代码的SubscriptionIDs属性.为此,您需要在DeviceSubscription.java课堂上进行以下更改:

要设置Text属性,请替换以下代码行:

deviceSubscription.setProperty(PROPERTY_SUBSCRIPTION_IDS, this.gson.toJson(subscriptions));

用这一行:

deviceSubscription.setProperty(PROPERTY_SUBSCRIPTION_IDS, new Text(this.gson.toJson(subscriptions)));

要从Text数据存储区获取属性:

    替换此行:

    String subscriptionString = (String) deviceSubscription.getProperty(PROPERTY_SUBSCRIPTION_IDS);
    

    有了这个:

    Text text = (Text) deviceSubscription.getProperty(PROPERTY_SUBSCRIPTION_IDS);
        String subscriptionString = text.getValue();
    

    替换此行:

    String ids = (String) deviceSubscription.getProperty(PROPERTY_SUBSCRIPTION_IDS);
    

    有了这个:

    Text text = (Text) deviceSubscription.getProperty(PROPERTY_SUBSCRIPTION_IDS);
          String ids = text.getValue();
    

    替换此行:

    String[] ids = new Gson().fromJson((String) entity.getProperty(PROPERTY_SUBSCRIPTION_IDS),
                String[].class);
    

    有了这个:

    Text text = (Text) entity.getProperty(PROPERTY_SUBSCRIPTION_IDS);
            String[] ids = new Gson().fromJson(text.getValue(), String[].class);
    

似乎是有效的解决方案.到目前为止,我还没有注意到对我项目的负面影响.

注:由于文档说Text没有索引,不能在查询过滤器使用和排序顺序.因此,如果SubscriptionIDs需要对属性进行索引,则此限制可能会导致另一个问题.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有