【问题标题】:Breeze failing silently while parsing metadataBreeze 在解析元数据时静默失败
【发布时间】:2014-02-24 18:02:28
【问题描述】:

试图轻装上阵,但遇到了最糟糕的错误,根本没有。我正在制作的元数据似乎没有被微风接受。我知道目前元数据存在一些问题,例如“foreignKeyNamesOnServer”中的值不正确以及其他一些问题。我正在制作的元数据可以在这里查看(太大): http://pastebin.com/ycP4jXxn

var serviceName = 'http://www.dockyard.com:8080/rest';
var entityManager = new breeze.EntityManager({serviceName: serviceName});
var entityQuery = new breeze.EntityQuery();
var query = breeze.EntityQuery.from("application")

entityManager.executeQuery(query)
    .then(function (data) {
        console.log(data);
    }, function (error) {
        console.log(error);
   });

所以我看到的行为是没有与元数据解析相关的 javascript 错误,元数据返回 200 OK。对 /rest/application 的命中返回 200 OK 并包含以下数据。

[{"@id":1,"id":1,"name":"dsad","deploymentStrategies":null,"versions":null,"groups":null},{"@id":2,"id":2,"name":"sss","deploymentStrategies":null,"versions":null,"groups":null},{"@id":3,"id":3,"name":"fdsfs","deploymentStrategies":null,"versions":null,"groups":null},{"@id":4,"id":4,"name":"fdsa","deploymentStrategies":null,"versions":null,"groups":null},{"@id":5,"id":5,"name":"dasda","deploymentStrategies":null,"versions":null,"groups":null}]

Promise 正在调用错误回调:在填充 metadataStore 之前无法执行 _executeQueryCore

元数据存储的内容:

{"namingConvention":{"name":"camelCase"},"localQueryComparisonOptions":{"name":"caseInsensitiveSQL","isCaseSensitive":false,"usesSql92CompliantStringComparison":true},"dataServices":[{"serviceName":"http://www.dockyard.com:8080/rest/","hasServerMetadata":true,"jsonResultsAdapter":"webApi_default","useJsonp":false}],"_resourceEntityTypeMap":{"platform":"Platform:#com.psidox.dockyard.controller.model.dockyard","application":"Application:#com.psidox.dockyard.controller.model.application","host":"Host:#com.psidox.dockyard.controller.model.host","groupdeploymentstrategy":"GroupDeploymentStrategy:#com.psidox.dockyard.controller.model.application","dockyard":"Dockyard:#com.psidox.dockyard.controller.model.dockyard","configurationentry":"ConfigurationEntry:#com.psidox.dockyard.controller.model","hoststrategy":"HostStrategy:#com.psidox.dockyard.controller.model.application","dockerimage":"DockerImage:#com.psidox.dockyard.controller.model.docker","version":"Version:#com.psidox.dockyard.controller.model.application","docker":"Docker:#com.psidox.dockyard.controller.model.docker","hostproviderconfig":"HostProviderConfig:#com.psidox.dockyard.controller.model.host","hostprovider":"HostProvider:#com.psidox.dockyard.controller.model.host","metadataimpl":"MetadataImpl:#com.psidox.dockyard.controller.model","deployment":"Deployment:#com.psidox.dockyard.controller.model.dockyard","hosttype":"HostType:#com.psidox.dockyard.controller.model.host","group":"Group:#com.psidox.dockyard.controller.model.application","groupimplementation":"GroupImplementation:#com.psidox.dockyard.controller.model.application","deploymentstrategy":"DeploymentStrategy:#com.psidox.dockyard.controller.model.dockyard","groupdeployment":"GroupDeployment:#com.psidox.dockyard.controller.model.application","metadata":"Metadata:#com.psidox.dockyard.controller.model"},"_structuralTypeMap":{},"_shortNameMap":{},"_ctorRegistry":{},"_incompleteTypeMap":{},"_incompleteComplexTypeMap":{},"_id":0,"_deferredTypes":{}}"

我很确定此错误与未从我的元数据正确填充元数据存储有关。只是想知道为什么 Breeze 在遇到无效元数据时没有抛出任何类型的错误?


编辑:

在调试解析元数据调用后,Breeze Metadata Schema Documentation 似乎已过期。快速浏览一下,它看起来已经发生了变化:

  • 键名“structuralTypeMap”已更改为“structuralTypes”。
  • “structuralTypeMap”曾经是一个对象,键为 EntityTypeName,值为实体定义。现在看来,“structuralTypes”是一个包含实体定义的数组。

如果元数据不包含任何结构类型,是否也应该抛出异常?目前它正在静默失败,这对调试没有太大帮助。

【问题讨论】:

  • 不确定发生了什么,但尝试直接调用 MetadataStore.fetchMetadata 看看是否可以处理那里的错误。

标签: metadata breeze


【解决方案1】:

我担心他们在学习游泳之前已经跳进了游泳池的深处。我钦佩你的勇敢,但我并不惊讶你正在努力维持生计。您没有遵循我们为您设置的任何简单路径。我认为这是因为这些路径都不适合您的情况。

从好的方面来说,您已经意识到我们很快必须让从自定义 REST 服务获取数据的开发人员更容易。

问题 #1

查询结果没有识别EntityType,并且您没有提到您编写了一个自定义JsonResultsAdapter 来解决这个问题。您的问题和下面的 MetadataStore 内容表明您正在使用开箱即用的 Web API 适配器,它不知道如何处理 JSON 查询结果。

这是您查询的 JSON 有效负载中的一项,已重新格式化以提高可读性

{
  "@id": 1,
  "id": 1,
  "name": "dsad",
  "deploymentStrategies": null,
  "versions": null,
  "groups": null
}

其中没有任何内容表明该数据属于哪个EntityType。光看我不知道这是什么类型。 Breeze也不知道。

您需要了解 "JsonResultsAdapter",这是 Breeze 如何解释来自服务器的 JSON 数据并将其映射到 EntityTypes 的实例。

Ruby Sample 有一个自定义的JsonResultsAdapter。这取决于服务器对它返回的每个对象的类型是明确的这一事实;看看每个 Rails 视图如何添加一个 $type 节点(例如,sessions:index view)。如果您可以控制服务器向客户端发送的内容,则可以采用这种方法。

Edmunds Sample 有一个自定义 JsonResultsAdapter,它必须通过检查 JSON 数据的特征来推断类型。这是一种法医练习,您只想在必要时沉迷其中。

问题 #2

您序列化的MetadataStore 没有所有类型信息。此处为易读性重新格式化

{
  "namingConvention": {
    "name": "camelCase"
  },
  "localQueryComparisonOptions": {
    "name": "caseInsensitiveSQL",
    "isCaseSensitive": false,
    "usesSql92CompliantStringComparison": true
  },
  "dataServices": [
    {
      "serviceName": "http:\/\/www.dockyard.com:8080\/rest\/",
      "hasServerMetadata": true,
      "jsonResultsAdapter": "webApi_default",
      "useJsonp": false
    }
  ],
  "_resourceEntityTypeMap": {
    "platform": "Platform:#com.psidox.dockyard.controller.model.dockyard",
    "application": "Application:#com.psidox.dockyard.controller.model.application",
    ... a bunch more ...
  },
  "_structuralTypeMap": {
    
  },
  "_shortNameMap": {
    
  },
  ... more emptiness ...
    
  }
}

发现问题 #3,我并不感到惊讶。

问题 #3

您的原始元数据与 Breeze 理解的格式不匹配。看起来像你手工拼凑而成的。它看起来肯定不像我认识的任何东西。它与实体框架中的 CSDL 格式不匹配。它与您在导出 MetadataStore 时看到的“Breeze 元数据格式”不匹配。

它几乎立刻就遇到了麻烦。下面是你如何开始定义你的第一个类型:

"structuralTypeMap": {
   "Group:#com.psidox.dockyard.controller.model.application": {
       "shortName": "Group",
       "namespace": "com.psidox.dockyard.controller.model.application",

它应该是这样开始的:

"structuralTypes": [
{
  "shortName": "Group",
  "namespace": "com.psidox.dockyard.controller.model.application",

我接受您的观点,即Breeze Metadata Schema Documentation 不正确。我们应该解决这个问题。

我很赞同你关于 Breeze 应该抛出异常的论点。我明白为什么它没有抛出。它只是忽略了所有它不理解的节点。很多解析器都会这样做,但这并不是一个充分的借口。

在这种情况下,它忽略了“structuralTypeMap”节点以及它必须说的关于类型的所有内容。当解析器完成时,它对类型一无所知。 Breeze 无法知道您将指定多少种类型,但如果没有,它可能会表现得可疑。

我承认我个人从未想过将这个元数据模式描述用作我的指南。这将是编写元数据的最困难的方法。

我建议你看看文档主题"Metadata by hand"

总之

  1. 请先检查一个简单的例子。也许埃德蒙兹。也许是鲁比。

  2. 学习手工编写元数据;不难。

  3. 了解JsonResultsAdapter

我们确实希望尽快为拥有“普通”REST 数据服务的开发人员提供具体指导。

【讨论】:

  • 我在后端使用 Java,从我所看到的情况来看,它肯定会在示例方面看到更多的爱。我确实注意到在 github/IdeaBlade/Breeze/tree/master/Samples_Unpublished/Java 中有一个创建元数据的示例。看来这个例子是一个正在进行中的工作,所以我不应该太努力,但代码质量还不是很好。我将它用作参考,但必须从头开始重写,因为它假定可以访问休眠配置,但 JEE 场景并非如此,因为配置通常被抽象掉。
  • 关于你的观点,1)我假设微风假设它从某个 RESTful URI 接收到的数据是指定实体类型的数据,而这个“resourceEntityTypeMap”数据结构是映射它的数据结构。 3) 元数据不应该太离谱。不幸的是,我发现手工制作的元数据有点难以理解,所以我回过头来尝试破译元数据模式。
  • 虽然我必须承认我最终开始回避微风。越来越深入地开始发现它并不真正尊重真正的 REST 架构。诚然,REST 并没有让交易变得特别容易,但我不会将它换成单个端点模型,这基本上只是 RPC。如果我看到它采用 json schema 之类的东西,而不是这种自定义模式格式和真正的 REST 架构,我会再给微风一次机会。
  • 请暂时不要放弃这艘船。我们的 Java 人员应该很快跟进。至于 REST(我们不要进入“真正的 REST”,因为似乎只有 Fielding 知道),你并不是唯一一个想要单独的 PUT/POST/DELETE/PATCH 端点的人。我们有即将推出的适配器。我们不会放弃元数据的内部 JavaScript 表示,但从 json 模式源转换是一个合理的请求。对你来说不是一个真正的表演者是吗?其他的,当然。
  • 是的,对不起,我不是故意听起来像 REST 纳粹。但是肯定是在寻找单独的资源端点。一个 json 模式适配器会很棒。关于你的 Java 人,如果他想看看我一直在走的方向,可以查看here。感谢您的回复!
猜你喜欢
  • 2013-03-20
  • 2023-04-03
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2011-02-20
相关资源
最近更新 更多