今天在ofbiz中新建一张表OpenProduct,在ofbiz后台访问这张新表时,出现了如下异常:
Helper name not found for entity OpenProduct
检查entitymodel.xml对entity的配置没有问题。在entitygroup.xml文件,也已经把entity"OpenProduct"添加进去了。Delegator为什么还是没有找到这个entity?
原因:
仔细查看ofbiz启动的日志,发现:delegator在初时化之前,先读入所有的entitymodel.xml文件,然后再读入所有的entitygroup.xml文件。在读入完entitygroup.xml文件后,检查entitygroup.xml中定义的所有的entity。这时候我的日志文件中出现了如下Warning:
[HelperNotFound] No Helper (DataSource) definition found for entity OpenProduct.
2010-04-15 12:26:59,468 (main) [ GenericDelegator.java:158:WARN ] [FieldTypeNotFound] Field type id-ne of entity OpenProduct not found in field type definitions (no helper definition found).
...
日志再往下看,发现还有两行INFO级别的日志:
2010-04-15 12:26:59,484 (main) [ GenericDelegator.java:168:INFO ] Delegator "default" initializing helper "null" for entity group "com.openb2c ".
2010-04-15 12:26:59,484 (main) [ GenericDelegator.java:168:INFO ] Delegator "default" initializing helper "localmysql" for entity group "org.ofbiz".
问题就在这里了:因为要先做一个ofbiz的项目:openb2c ,所以把entitygroup.xml的<entity-group group="org.ofbiz" entity="OpenProduct" />中的group属性改成了"com.openb2c "即:
<entity-group group="com.openb2c " entity="OpenProduct" />
ofbiz在读完所有的entitymodel.xml和entitygroup.xml文件以后,就会对delegator进行初始化。初始化是根据entityengine.xml配置文件来的。由于在我的entityengine.xml中,只有如下定义:
<delegator name="default" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="false">
<group-map group-name="org.ofbiz" datasource-name="localmysql"/>
</delegator>
并没有定义group:com.myOpen。所以entity group "com.myOpen"并没有被初始化。所以OpenProduct这个entity就没有办法找到其对应的entitygroup了。
解决办法:
想使用自己的entity group,需要在entityengine.xml中添加定义:
<delegator name="OpenB2C " entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="false">
<group-map group-name="com.openb2c " datasource-name="localmysql"/>
</delegator>
并且在每一个ofbiz模块(component)里的web.xml中修改:
<context-param>
<param-name>entityDelegatorName</param-name>
<param-value>default</param-value>
<description>The Name of the Entity Delegator to use, defined in entityengine.xml</description>
</context-param>
把param-value改成新的delegator的名字:OpenB2C 。
在entitygroup.xml中添加entity时改成:
<entity-group group="com.openb2c " entity="OpenProduct" />
重启ofbiz,就能使用这个entity了。
继续研究ofbiz。