Hybris DDIC 类型和 Model Class 的关联关系
【摘要】 在ABAP里,我们在SE11里面创建data type或者transparent table, 然后在ABAP代码里可以直接消费这些DDIC object.而Hybris是基于Java的,大家知道在Java里除了primitive type如int, boolean这些一样,万物皆对象. 数据类型是一个Java Class,而这些数据类型具体的item(transaction data)就是...
在ABAP里,我们在SE11里面创建data type或者transparent table, 然后在ABAP代码里可以直接消费这些DDIC object.
而Hybris是基于Java的,大家知道在Java里除了primitive type如int, boolean这些一样,万物皆对象. 数据类型是一个Java Class,而这些数据类型具体的item(transaction data)就是Java Class的一个个实例:
every object stored in SAP Hybris Commerce is an instance of a type.
例子:
我在catalog这个extension里定义了一个data type catalog, 里面有个字段id:
那么用ant clean all build之后,会自动在这个folder下面生成对应的Model class, 遵循naming convention Model.java:
生成的Model class - 这种套路在ABAP里随处可见了,比如我们在SEGW里做Odata model,然后直接激活生成DPC MPC.
因为我在xml里指定了read=true, write=true, 因此会生成对应的getter和setter方法:
用法很简单,在Java code里拿到model instance,直接call setter / getter:
之前我遇到一个问题,从ERP QV5到CRM X3D的response没有回来,原因是因为在ERP端的CRMRFAPCR表里面,没有到X3D的配置,新增一条配置信息:
OBJNAME = MATERIAL && DOWNLOAD = R, 这样会优先选出更Specific的到X3D的这条。
重新执行,Request就可以返回CRM端了,但是还有错:
Debug发现是因为在CRM上配的源系统跟Download过来的系统不匹配,在CRM端的CRMMLSGUID表里面:
可以看到X3D原来配的系统是QI3,之前用T-CODE SMOEAC找到的SITE里面有多个系统:
之前我想QI3已经被X3C用了,而且X3D到QI3的SM59连接测试不通过,所以就重新找了一个看起来好用的QV5,现在似乎又绕回来了。
能想到的有两个办法:
X3D继续用QV5,在X3D的CRMMLSGUID表里增加QV5配置作为workaround,测完了删掉。
X3D连QI3,报IT TICKET建立X3D/QI3的双向RFC连接,在QI3的CRMRFAPCR表里配置回到X3D的信息,考虑到X3C已经在QI3上测了,可能要用不同测Client避免冲突。
SAP Cloud for Customer里没有办法新建product:
Product detail page也无法编辑:
在C4C的business scoping里enable和ERP的integration:
在C4C里新建一个communication system:
technical information维护成ERP系统的信息:
ERP系统,tcode SRTIDOC注册IDOC inbound service:
SPRO,自动生成和C4C的integration setting:
选择使用PI作为middleware:
将主数据同步勾上:
选择C4C的tenant id:
指定PI的host name:
凡是这种tagdir =相对路径的tag都是Hybris标准开发自己做的tag,目的和BSP一样:重用。
在project folder里顺着tagdir里的路径能找到对应的.tag实现:
C同事问了我这个问题。
使用下列这段代码extend UI5标准的控件。
问题1:为什么new 一个JerryButton时,line 35会触发?
var oJerryButton = new JerryButton({ application: oApplication } );
答案:
debug extend的实现, 在line 330里把调用extend指定的constructor赋给fnClass
然后在line 352把fnClass赋给fnClass.prototype.constructor. 这样,每次用fnClass这个构造器new新的instance时,constructor指向的function会自动被call到。
问题2
为什么把constructor的赋值放到extend function外面,由application自己显式赋值,但是在new的时候却不会被调用到了?
答案:
原因是此时传入的constructor为undefine,因此fnClass也是undefine
所以line 352注入的实际上是line 346动态生成的函数体为fnBaseClass.apply的function,这样当然我们自定义的constructor不会执行了。
如果你非要想在extend外面指定constructor,怎么弄?
只需要这样:
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)