Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Reference中的数据是异步加载的,采用这样的设计后,即使这个数据没有加载到客户端,也不会对用户的操作带来任何影响,同时这种设计也有利于页面快速的展现给系统的操作人员,从而提高更好的用户体验。

(三)不支持循环引用的数据实体

当前父DataType如果包含子DataType集合,则子DataType就不能再将父DataType当作自己的子属性。因为这会导致数据输出时很难计算这种环状的引用关系,它无法断定是否要输出对应的子节点,如果要输出就会导致死循环。从而会抛出如下的错误。DataType可以用于定义复杂数据对象,以及定义对象关系。但是对象关系定义时,要避免嵌套逻辑关系的定义,因为最终当一个数据实体被输出到客户端时,Java对象会根据DataType的定义决定输出那些属性到客户端,而如果你的DataType的定义中形成了嵌套的闭环关系,会导致这个对象无法被正常的转换为一个合适的JSON对象输出到客户端。为避免这种情况Dorado会在服务器端输出时提起做这种检查,一旦发现这种问题就会直接抛出如下的异常:

Code Block
ERROR:
com.bstek.dorado.view.output.DataOutputter - java.lang.IllegalArgumentException:
不支持循环引用的数据实体

举例:

Category和Propduct是一对多的关系,Category中含products属性,DataType是Product类型的:

Category和Propduct两个Java对象是一对多的关系,Category中含products属性,Product又包含Category对象。

Code Block
java
Category c = new Category();
Product p = new Product();
p.setCategory(c);
c.getProducts().add(p);

这个时候上面的Category和Product是相互引用的关系,而这个时候直接转Json是会出错的。

当然在日常的开发中我们可能并不需要输出这种相互引用的嵌套关系。我们而采取一些技巧避免这种问题,如输出Product信息的时候我们就不输出Product中的category属性了。

在Dorado中由于我们是通过DataType来定义Java对象的结构的,通常我们用PropertyDef来定义一个对象的属性,如果你通过PropertyDef定义对象的属性,一旦你将一个Java对象通过Dorado的Ajax技术返回到前台的时候,Dorado就会将Java对象对应的这个属性的值转换为Json输出到前台。由于这个规则,如果你返回的是一个具有相互应用关系的两个不同对象,而恰好DataType设计时,又正好通过PropertyDef定义导致了DataType的相互引用,这个时候就会出现上面的“不支持循环引用的数据实体”的错误。以上面的Category和Product对象为例,看下面的DataType配置,就会导致错误。

Category下有一个名称为products的PropertyDef,他DataType是Product集合类型的:

而对应名称为Product的DataType的内部又含有category对象的定义,并且dataType属性为Category:

这种情况下就发生了DataType的嵌套关系,是不允许的。 

(四)Boolean和boolean的差别

虽然这个差别与Java中Boolean和boolean的差别一样,但是在展现层开发的时候很多人还是会忽略这两种类型的差别,所以再强调一下。

...